<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:nubela="http://nubela.co/blog/" version="2.0">
<channel>
<title><![CDATA[ NinjaPear Blog ]]></title>
<description><![CDATA[ Welcome to the NinjaPear blog, where we will chronicle our journey in building the world&#x27;s largest first-party B2B data platform. ]]></description>
<link>https://nubela.co/blog</link>
<image>
    <url>https://nubela.co/blog/favicon.png</url>
    <title>NinjaPear Blog</title>
    <link>https://nubela.co/blog</link>
</image>
<lastBuildDate>Wed, 03 Jun 2026 16:52:37 +0800</lastBuildDate>
<atom:link href="https://nubela.co/blog" rel="self" type="application/rss+xml"/>
<ttl>60</ttl>

    <item>
        <title><![CDATA[ Ultimate Guide to the LinkedIn API: Person Profile Enrichment API, with Python Examples ]]></title>
        <description><![CDATA[ Learn all about the Professional Social Network API, with comprehensive Python code demos. Dive into the world of Professional Social Network APIs, official and third-party alternatives, and understand how to access and utilize Professional Social Network profile data through Python code examples. ]]></description>
        <link>https://nubela.co/blog/ultimate-guide-to-linkedin-api_people-profile-api_with-python-examples/</link>
        <guid isPermaLink="false">6038ba67418c82000107db70</guid>
        <category><![CDATA[ profile api ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 11 Dec 2024 11:00:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_424.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<pre><code class="language-bash">curl -G \
  &quot;https://nubela.co/api/v1/employee/profile&quot; \
  --data-urlencode &quot;first_name=Patrick&quot; \
  --data-urlencode &quot;last_name=Collison&quot; \
  --data-urlencode &quot;employer_website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer demo-api-key&quot;
</code></pre>
<p>If you are building against the <strong>LinkedIn API</strong> for <strong>person profile enrichment</strong>, start there.</p>
<p>That demo call hits NinjaPear's Person Profile endpoint through the <a href="https://nubela.co/employee-api?ref=nubela.co">Employee API</a>. It returns enriched profile data using public web sources and AI extraction, not LinkedIn scraping.</p>
<p>Now the important part.</p>
<p>If you are searching for a LinkedIn People Profile API, there are really two questions you need answered.</p>
<p>First, what can the official LinkedIn API actually do?</p>
<p>Second, when does it stop being the right tool for the job?</p>
<p>I have unusually strong opinions on this because I earned them the expensive way. I used to be the CEO of Proxycurl. We grew it to ~10M ARR and, for a time, it was probably the largest LinkedIn scraping service in the market. I spent years inside the machinery of LinkedIn profile data, official and unofficial. So this guide is not theory. It is the version I wish more developers got on day one.</p>
<h2 id="what-the-linkedin-api-actually-does">What the LinkedIn API actually does</h2>
<p>LinkedIn shut down broad public API access years ago. If you want meaningful access today, you are dealing with approvals, OAuth scopes, product restrictions, and business qualification.</p>
<p>That does not mean the LinkedIn API is bad. It means it is opinionated. It is designed around LinkedIn's platform interests, not around every enrichment workflow a sales, recruiting, or data product team might want.</p>
<p>At a high level, the official LinkedIn API is still good at a few specific things:</p>
<ul>
<li>Sign In with LinkedIn</li>
<li>member-authorized profile access</li>
<li>posting and social actions</li>
<li>organization workflows</li>
<li>approved partner use cases</li>
</ul>
<p>If your product needs <strong>native LinkedIn functionality</strong>, use LinkedIn.</p>
<p>Examples:</p>
<ul>
<li>users sign in with LinkedIn</li>
<li>users post to LinkedIn from your app</li>
<li>your workflow depends on authenticated member actions</li>
<li>you are already in an approved LinkedIn program</li>
</ul>
<p>That is the cleanest use case for the official API. No argument from me.</p>
<h2 id="where-person-profile-enrichment-gets-tricky">Where person profile enrichment gets tricky</h2>
<p>Most people searching for a <strong>LinkedIn API People Profile API</strong> are not actually trying to build a LinkedIn app.</p>
<p>They are trying to:</p>
<ul>
<li>enrich a lead in a CRM</li>
<li>find the right buyer at a company</li>
<li>turn a work email into a usable person profile</li>
<li>turn a title plus company into an actual human being</li>
<li>pull professional identity data into an internal workflow</li>
</ul>
<p>That is a different problem.</p>
<p>When I was running Proxycurl, this was the mistake I saw over and over. Teams said they needed <strong>LinkedIn data</strong>. What they usually needed was <strong>accurate structured professional identity data</strong> for <strong>person profile enrichment</strong>. Those are not the same thing.</p>
<p>The official LinkedIn API can still help, but only within the constraints LinkedIn allows.</p>
<h2 id="what-most-developers-discover">What most developers discover</h2>
<p>The first trap is simple.</p>
<p>A lot of developers assume <code>Sign In with LinkedIn</code> returns a detailed member profile. Usually it does not. The basic member-authorized flow typically gets you a small set of fields such as:</p>
<ul>
<li>first name</li>
<li>last name</li>
<li>email address</li>
<li>profile photo</li>
</ul>
<p>That is fine for auth. It is weak for enrichment.</p>
<p>And there is a more annoying catch.</p>
<p><code>Sign In with LinkedIn</code> also does <strong>not</strong> give you the signed-in user's LinkedIn profile URL, and it does <strong>not</strong> give you the person's full profile object in the way most developers expect. If your plan is, "I will let the user sign in, grab their LinkedIn profile URL, then use that as the key for person profile enrichment," you are already at a dead end.</p>
<p>This is the part a lot of guides hand-wave away. I will not. For person profile enrichment, auth data is not profile data.</p>
<p>If you need work history, education, social handles, current company context, or a way to resolve a person from <code>role + company</code>, the official LinkedIn API is usually not the easy path people hope it is. It is especially not a good fit if your real requirement is <strong>person profile enrichment</strong> across prospects or candidates you do not control.</p>
<h2 id="linkedin-api-methods">LinkedIn API methods</h2>
<p>For profile access, there are really two lanes.</p>
<h3 id="method-1-3-legged-oauth">Method 1: 3-legged OAuth</h3>
<p>This is the normal member-authorized flow. A user grants your app permission, and you fetch the profile data available to that permission set.</p>
<p>This is useful when a user is inside your app and intentionally connects their own LinkedIn account.</p>
<p>It is not useful if you want to enrich arbitrary prospects at scale.</p>
<h3 id="method-2-approved-profile-access">Method 2: approved profile access</h3>
<p>This is the path people usually mean when they talk about the real LinkedIn People/Profile API.</p>
<p>The catch is the catch: approvals, business qualification, product restrictions, and commercial friction.</p>
<p>If you are in recruiting tech, sales tech, or anything adjacent to where LinkedIn has its own product interests, life tends to get more complicated.</p>
<h2 id="python-example-sign-in-with-linkedin">Python example: Sign In with LinkedIn</h2>
<p>I am keeping this part because the OAuth mechanics are still useful.</p>
<pre><code class="language-python">import requests
import secrets

LINKEDIN_CLIENT_ID = &quot;your_client_id&quot;
LINKEDIN_CLIENT_SECRET = &quot;your_client_secret&quot;
LINKEDIN_REDIRECT_URI = &quot;https://yourapp.com/callback&quot;


def generate_authorization_url():
    auth_url = &quot;https://www.linkedin.com/oauth/v2/authorization&quot;
    return requests.Request(
        &quot;GET&quot;,
        auth_url,
        params={
            &quot;response_type&quot;: &quot;code&quot;,
            &quot;client_id&quot;: LINKEDIN_CLIENT_ID,
            &quot;redirect_uri&quot;: LINKEDIN_REDIRECT_URI,
            &quot;state&quot;: secrets.token_hex(8).upper(),
            &quot;scope&quot;: &quot; &quot;.join([&quot;r_liteprofile&quot;, &quot;r_emailaddress&quot;]),
        },
    ).prepare().url


def get_access_token(authorization_code):
    token_url = &quot;https://www.linkedin.com/oauth/v2/accessToken&quot;
    response = requests.post(
        token_url,
        data={
            &quot;grant_type&quot;: &quot;authorization_code&quot;,
            &quot;code&quot;: authorization_code,
            &quot;redirect_uri&quot;: LINKEDIN_REDIRECT_URI,
            &quot;client_id&quot;: LINKEDIN_CLIENT_ID,
            &quot;client_secret&quot;: LINKEDIN_CLIENT_SECRET,
        },
    )
    response.raise_for_status()
    return response.json()[&quot;access_token&quot;]


def get_profile(access_token):
    profile_url = &quot;https://api.linkedin.com/v2/me&quot;
    response = requests.get(
        profile_url,
        headers={&quot;Authorization&quot;: f&quot;Bearer {access_token}&quot;},
    )
    response.raise_for_status()
    return response.json()
</code></pre>
<p>This works for authentication.</p>
<p>It is not what most GTM, recruiting, or enrichment products actually need.</p>
<p>If you are hoping this flow gets you a signed-in member's LinkedIn profile URL plus a rich person record you can use for downstream enrichment, it does not. That is why so many teams burn a week here and then quietly change direction.</p>
<h2 id="python-example-approved-linkedin-profile-access">Python example: approved LinkedIn profile access</h2>
<p>If you are on an approved path that allows broader profile retrieval, the flow looks more like this:</p>
<pre><code class="language-python">import requests

LINKEDIN_CLIENT_ID = &quot;your_client_id&quot;
LINKEDIN_CLIENT_SECRET = &quot;your_client_secret&quot;


def get_access_token():
    token_url = &quot;https://www.linkedin.com/oauth/v2/accessToken&quot;
    response = requests.post(
        token_url,
        data={
            &quot;grant_type&quot;: &quot;client_credentials&quot;,
            &quot;client_id&quot;: LINKEDIN_CLIENT_ID,
            &quot;client_secret&quot;: LINKEDIN_CLIENT_SECRET,
        },
    )
    response.raise_for_status()
    return response.json()[&quot;access_token&quot;]


def get_profile(access_token, profile_id):
    profile_url = f&quot;https://api.linkedin.com/v2/people/{profile_id}&quot;
    response = requests.get(
        profile_url,
        headers={
            &quot;Authorization&quot;: f&quot;Bearer {access_token}&quot;,
            &quot;X-RestLi-Protocol-Version&quot;: &quot;2.0.0&quot;,
        },
    )
    response.raise_for_status()
    return response.json()
</code></pre>
<p>Two caveats.</p>
<p>First, this is conceptually useful, but actual access depends on LinkedIn approvals and product terms.</p>
<p>Second, LinkedIn can be the right platform API and still be the wrong <strong>person profile enrichment</strong> API for your use case.</p>
<h2 id="what-the-official-linkedin-api-is-good-at">What the official LinkedIn API is good at</h2>
<p>I want to be precise here, because a lot of content on this topic gets lazy.</p>
<p>The official LinkedIn API is good when all three of these are true:</p>
<ol>
<li>you need official platform support</li>
<li>the member is knowingly participating in the workflow</li>
<li>the workflow is native to LinkedIn itself</li>
</ol>
<p>That includes:</p>
<ul>
<li>sign-in</li>
<li>content publishing</li>
<li>organization-level actions</li>
<li>approved partner features</li>
</ul>
<p>If that is your world, do not fight it. Use LinkedIn.</p>
<p>The problems start when developers try to stretch that model into broad outbound enrichment, prospecting, recruiting discovery, or CRM backfill for people who have never touched their product.</p>
<p>That is where people start looking for a <strong>person profile enrichment</strong> API, even if they use LinkedIn-flavored language to describe it.</p>
<h2 id="start-with-ninjapears-person-profile-endpoint">Start with NinjaPear's Person Profile Endpoint</h2>
<p>Now that we have covered the official LinkedIn API properly, here is the practical alternative for the enrichment use case.</p>
<p>Run this:</p>
<pre><code class="language-bash">curl -G \
  &quot;https://nubela.co/api/v1/employee/profile&quot; \
  --data-urlencode &quot;first_name=Patrick&quot; \
  --data-urlencode &quot;last_name=Collison&quot; \
  --data-urlencode &quot;employer_website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer demo-api-key&quot;
</code></pre>
<p>That call hits NinjaPear's Person Profile endpoint through the <a href="https://nubela.co/employee-api?ref=nubela.co">Employee API</a>.</p>
<p>It returns enriched profile data using public web sources and AI extraction, not LinkedIn scraping.</p>
<p>That distinction matters.</p>
<p>It means you can get the <strong>shape</strong> of data most people want from a LinkedIn People Profile API, or more specifically a <strong>person profile enrichment</strong> API, without inheriting the scraping mess that usually comes with it.</p>
<h2 id="why-i-am-confident-saying-this">Why I am confident saying this</h2>
<p>This is where my opinion gets less academic.</p>
<p>I used to run Proxycurl, the company that became one of the best-known LinkedIn scraping businesses in the market. We scaled it to ~10M ARR. For a while, if you were buying LinkedIn profile data from a third party, there was a decent chance you were buying from someone whose architecture rhymed with ours.</p>
<p>So when I say LinkedIn profile data is not just a coding problem, I mean that literally.</p>
<p>It is:</p>
<ul>
<li>an access problem</li>
<li>a scaling problem</li>
<li>a freshness problem</li>
<li>a legal problem</li>
<li>and eventually a business model problem</li>
</ul>
<p>That is exactly why NinjaPear went in a different direction.</p>
<h2 id="why-scraping-linkedin-gets-ugly">Why scraping LinkedIn gets ugly</h2>
<p>This is where I have earned the right to be blunt.</p>
<p>When I hear companies say, "we scrape public LinkedIn profiles at scale," I immediately split them into two buckets:</p>
<ol>
<li>they are serving stale database results</li>
<li>they are not only scraping public profiles</li>
</ol>
<p>That sounds harsh. It is still usually true.</p>
<p>Open an incognito window and visit a public LinkedIn profile. Look at what is actually visible. Recent experience is often censored. Important fields are truncated. Public profile pages are not what they used to be.</p>
<p>So when a vendor says they can always return rich current profile data from public LinkedIn pages only, one of two things is happening:</p>
<ul>
<li>they are reading from an old warehouse of previously captured profiles</li>
<li>they are using login-bound access patterns and calling it public</li>
</ul>
<p>I am not guessing from the outside. I lived inside this machine for years.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/evilprince2009</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">LinkedIn can detect automated activity &amp; patterns. Scrapping higher volume will definitely catch their eyes - no matter what tool you use.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1swxsqa/scrape_linkedin_to_get_leads/oiks1b4/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>The hard part is not writing a scraper. A good engineer can do that over a weekend.</p>
<p>The hard parts are:</p>
<ul>
<li>keeping it alive for years</li>
<li>keeping quality high under rate pressure</li>
<li>handling bans, throttles, retries, and account churn</li>
<li>handling legal and operational risk</li>
<li>doing all of this at millions of profiles per month</li>
</ul>
<p>That is why I no longer think "just scrape LinkedIn" is serious advice for most companies.</p>
<h2 id="why-ninjapear-is-different">Why NinjaPear is different</h2>
<p>NinjaPear's <a href="https://nubela.co/employee-api?ref=nubela.co">Employee API</a> does <strong>not</strong> scrape LinkedIn and will not scrape LinkedIn.</p>
<p>Instead, NinjaPear aggregates professional identity signals from public web sources, then uses AI extraction and entity resolution to turn messy evidence into a clean profile object.</p>
<p>That means you can get the output shape you wanted from a LinkedIn People Profile API without taking on LinkedIn's platform constraints or scraping bottlenecks.</p>
<p>In some cases, you can get more useful workflow data because the source base is broader than LinkedIn alone.</p>
<p>That is the important distinction. NinjaPear is not a LinkedIn clone. It is a <strong>person profile enrichment</strong> system that happens to solve the same business problem most people think they need LinkedIn for.</p>
<h2 id="ninjapear-person-profile-inputs">NinjaPear Person Profile inputs</h2>
<p>This is the practical part.</p>
<p>With NinjaPear, you do not need to start from a LinkedIn URL. In many workflows, that is not even the best input.</p>
<p>You can resolve a person profile in three useful ways:</p>
<ol>
<li><strong>work email</strong></li>
<li><strong>name + company</strong></li>
<li><strong>role + company</strong></li>
</ol>
<p>That maps much better to how real teams work.</p>
<h3 id="work-email">Work email</h3>
<p>This is the cleanest input when you have it.</p>
<pre><code class="language-bash">curl -G \
  &quot;https://nubela.co/api/v1/employee/profile&quot; \
  --data-urlencode &quot;work_email=steven@nubela.co&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<p>Why it works well:</p>
<ul>
<li>work email is a strong identifier</li>
<li>ambiguity is low</li>
<li>it fits CRM enrichment and inbound lead flows</li>
</ul>
<h3 id="name-company">Name + company</h3>
<p>This is the standard path when you know the person and want a structured profile.</p>
<pre><code class="language-bash">curl -G \
  &quot;https://nubela.co/api/v1/employee/profile&quot; \
  --data-urlencode &quot;name=Patrick Collison&quot; \
  --data-urlencode &quot;employer_website=stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<p>Good for:</p>
<ul>
<li>CRM backfills</li>
<li>prospecting pipelines</li>
<li>candidate enrichment</li>
<li>spreadsheet workflows</li>
</ul>
<p>If you prefer explicit fields, the same lookup pattern also works well as <code>first_name + last_name + employer_website</code>, which is why I used that format in the demo call at the top.</p>
<h3 id="role-company">Role + company</h3>
<p>This is the input I like most.</p>
<p>You know the title. You know the company. You do not know the person yet.</p>
<pre><code class="language-bash">curl -G \
  &quot;https://nubela.co/api/v1/employee/profile&quot; \
  --data-urlencode &quot;role=cto&quot; \
  --data-urlencode &quot;employer_website=delve.co&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<p>This is a much better starting point for outbound than poking around the LinkedIn UI and hoping the workflow holds together.</p>
<h2 id="python-example-ninjapear-person-profile">Python example: NinjaPear Person Profile</h2>
<p>Here is the Python version using <code>work_email</code>.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_api_key&quot;
API_URL = &quot;https://nubela.co/api/v1/employee/profile&quot;


def get_profile_by_work_email(work_email: str):
    response = requests.get(
        API_URL,
        headers={&quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;},
        params={&quot;work_email&quot;: work_email},
        timeout=60,
    )
    response.raise_for_status()
    return response.json()


if __name__ == &quot;__main__&quot;:
    profile = get_profile_by_work_email(&quot;steven@nubela.co&quot;)
    print(profile)
</code></pre>
<p>Here is <code>name + company</code>.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_api_key&quot;
API_URL = &quot;https://nubela.co/api/v1/employee/profile&quot;


def get_profile_by_name_company(name: str, employer_website: str):
    response = requests.get(
        API_URL,
        headers={&quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;},
        params={
            &quot;name&quot;: name,
            &quot;employer_website&quot;: employer_website,
        },
        timeout=60,
    )
    response.raise_for_status()
    return response.json()
</code></pre>
<p>Here is the explicit <code>first_name + last_name + employer_website</code> version that matches the demo.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_api_key&quot;
API_URL = &quot;https://nubela.co/api/v1/employee/profile&quot;


def get_profile_by_name_parts(first_name: str, last_name: str, employer_website: str):
    response = requests.get(
        API_URL,
        headers={&quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;},
        params={
            &quot;first_name&quot;: first_name,
            &quot;last_name&quot;: last_name,
            &quot;employer_website&quot;: employer_website,
        },
        timeout=60,
    )
    response.raise_for_status()
    return response.json()


if __name__ == &quot;__main__&quot;:
    profile = get_profile_by_name_parts(&quot;Patrick&quot;, &quot;Collison&quot;, &quot;https://stripe.com&quot;)
    print(profile)
</code></pre>
<p>And <code>role + company</code>.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_api_key&quot;
API_URL = &quot;https://nubela.co/api/v1/employee/profile&quot;


def get_profile_by_role_company(role: str, employer_website: str):
    response = requests.get(
        API_URL,
        headers={&quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;},
        params={
            &quot;role&quot;: role,
            &quot;employer_website&quot;: employer_website,
        },
        timeout=60,
    )
    response.raise_for_status()
    return response.json()
</code></pre>
<p>Short. Boring. Good.</p>
<p>That is how an enrichment API should feel.</p>
<h2 id="linkedin-api-vs-person-profile-enrichment-api">LinkedIn API vs person profile enrichment API</h2>
<p>If we compare the LinkedIn API and NinjaPear specifically for <strong>person profile enrichment</strong>, my view is straightforward.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Official LinkedIn API</th>
<th>NinjaPear Person Profile</th>
<th>Scraper vendors</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Getting started</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Legal clarity</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Cost for most teams</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Native LinkedIn actions</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>LinkedIn API</td>
</tr>
<tr>
<td>Profile enrichment usefulness</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Scaling reliability</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.00/5</strong></td>
<td><strong>4.33/5</strong></td>
<td><strong>2.83/5</strong></td>
<td><strong>NinjaPear</strong></td>
</tr>
</tbody>
</table>
<h3 id="faster-to-start">Faster to start</h3>
<p>NinjaPear's homepage is explicit: <strong>3-day free trial, 10 credits included, no credit card required</strong>.</p>
<p>That beats waiting on partner approvals.</p>
<h3 id="lower-legal-exposure">Lower legal exposure</h3>
<p>This matters more than people like to admit.</p>
<p>If you are not scraping LinkedIn, you are not building your product on top of LinkedIn scraping risk. That is not only a legal simplification. It is an operational simplification.</p>
<p>No account farms. No anti-detection stack. No proxy bill that slowly turns into a second cloud bill.</p>
<h3 id="better-workflow-fit">Better workflow fit</h3>
<p>LinkedIn thinks in LinkedIn-shaped primitives. NinjaPear thinks in workflow-shaped primitives.</p>
<p>Examples:</p>
<ul>
<li>enrich this work email</li>
<li>find the CTO at this company</li>
<li>get a full company profile</li>
<li>find a verified work email</li>
<li>find peer contacts across a competitive set</li>
</ul>
<p>These are business actions, not platform actions.</p>
<h3 id="useful-adjacent-endpoints">Useful adjacent endpoints</h3>
<p>This is where shallow comparisons usually fail.</p>
<p>It is not enough to ask, "can I get a profile?" You should ask whether you can finish the workflow.</p>
<p>Useful adjacent NinjaPear primitives include:</p>
<ul>
<li><strong>Work email finder</strong></li>
<li><strong>Company profile</strong></li>
<li><strong>Employee count</strong></li>
<li><strong>Competitor API</strong></li>
<li><strong>Customer API</strong></li>
<li><strong>Supportive for Gmail</strong></li>
</ul>
<p>That ecosystem matters because <strong>person profile enrichment</strong> is rarely a one-endpoint problem.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/brooklyn_babyx</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">yea that’s the problem w apollo tbh even if you use the “verified” filter, you still end up w a bunch of unverifieds. they don’t verify in real time, so by the time you export, a lot of emails are already invalid. plus, most other scrapers pull from Apollo too, so you get a ton of duplicates across tools...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1mjbnyh/a_little_stuck_on_lead_scraping_sources_like/n7gmxi8/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is about email data, but the pattern is universal: stale warehouse data always looks great in a deck and worse in production.</p>
<h2 id="the-scaling-truth">The scaling truth</h2>
<p>This is the least sexy part of the article and probably the most useful.</p>
<p>At small scale, almost anything works.</p>
<p>At 200 profiles, your scraper works.<br />
At 2,000, it still sort of works.<br />
At 200,000, you start learning religion.<br />
At millions per month, every lie in your architecture gets exposed.</p>
<p>When we were running Proxycurl, the biggest hidden cost was not the code. It was uncertainty.</p>
<p>You do not know when the source changes.
You do not know which access pattern dies next.
You do not know when throughput assumptions collapse.
You do not know whether your current quality depends on something brittle and semi-private.</p>
<p>That is why I care so much that NinjaPear does <strong>not</strong> scrape LinkedIn.</p>
<p>The absence of that dependency is not just a compliance talking point. It is a scaling advantage.</p>
<p>It means the business is not forced to keep fighting the same source war forever.</p>
<h2 id="practical-decision-framework">Practical decision framework</h2>
<p>Use this if you want the simple version.</p>
<h3 id="pick-the-linkedin-api-if">Pick the LinkedIn API if</h3>
<ul>
<li>your product lives inside LinkedIn workflows</li>
<li>you need authenticated member actions</li>
<li>you already have, or can realistically get, the required approvals</li>
<li>official platform support matters more than enrichment breadth</li>
</ul>
<h3 id="pick-ninjapear-if">Pick NinjaPear if</h3>
<ul>
<li>you need person profiles, not LinkedIn buttons</li>
<li>you care about <code>work_email</code>, <code>name + company</code>, or <code>role + company</code> lookups</li>
<li>you want to get started immediately</li>
<li>you want lower legal exposure</li>
<li>you want adjacent enrichment like work email lookup and company data</li>
<li>you need a <strong>person profile enrichment</strong> API rather than a social platform API</li>
</ul>
<h3 id="avoid-scraper-first-architecture-if">Avoid scraper-first architecture if</h3>
<ul>
<li>your product depends on predictable throughput</li>
<li>your customers expect stable SLAs</li>
<li>you are building for the long haul</li>
<li>you do not want your data pipeline to become a permanent cat-and-mouse job</li>
</ul>
<h2 id="my-honest-conclusion">My honest conclusion</h2>
<p>If you came here searching for the <strong>LinkedIn API People Profile API</strong>, the most useful answer I can give you is this:</p>
<p>The official LinkedIn API is real, and it has valid use cases. But for most <strong>person profile enrichment</strong> workflows, it is the wrong hill to die on.</p>
<p>I used to be much more willing to brute-force this class of problem. That was my mistake. I spent years too close to the machinery of LinkedIn scraping, and the lesson I took away was not, "get better proxies." Instead, I learned to stop depending on this source unless the business absolutely requires it.</p>
<p>That is exactly why NinjaPear went the direction it did.</p>
<p>You can get person-profile-shaped data through the <a href="https://nubela.co/employee-api?ref=nubela.co">Employee API</a>, resolve people by work email, <code>name + company</code>, <code>first_name + last_name + company</code>, or <code>role + company</code>, and build the rest of the workflow with adjacent enrichment primitives. No LinkedIn scraping. No pretending public profile pages still contain everything. No bullshit.</p>
<p>If you truly need LinkedIn-native actions, use LinkedIn.</p>
<p>If you want a <strong>person profile enrichment</strong> API with Python examples and a sane integration path, start with NinjaPear instead. Run the demo call at the top. That will tell you more in 30 seconds than another week of reading LinkedIn partner documentation.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>

    <item>
        <title><![CDATA[ Introducing API Playground (and YouTube Monitoring!) ]]></title>
        <description><![CDATA[ API Playground in the Dashboard


I&#39;m pleased to share that there is now an API playground in the dashboard. Essentially, it mirrors the user interface of Postman, except your API keys are automatically populated in the playground.


This is how the API playground looks like:


Really, I built ]]></description>
        <link>https://nubela.co/blog/introducing-api-playground-and-youtube-monitoring/</link>
        <guid isPermaLink="false">6a1e5b382702ff0001b0075d</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 02 Jun 2026 16:26:22 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/06/playground.jpg" medium="image"/>
        <content:encoded><![CDATA[ <h2 id="api-playground-in-the-dashboard">API Playground in the Dashboard</h2>
<p>I'm pleased to share that there is now an <a href="https://nubela.co/dashboard/api/playground?ref=nubela.co">API playground in the dashboard</a>. Essentially, it mirrors the user interface of Postman, except your API keys are automatically populated in the playground.</p>
<p>This is how the API playground looks like:</p>
<figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/06/Screenshot-2026-06-02-at-11.40.06---AM.png" class="kg-image" alt="" loading="lazy" width="3232" height="2122"></figure><p>Really, I built this for myself because I spend a lot of time testing out NinjaPear API endpoints and I really just want to quickly add new parameters without typing out the full <code>curl</code> command or getting slow LLMs to generate them. And if I find it useful, I'm sure some of you will find it useful as well, particularly those who use NinjaPear via API.</p>
<h2 id="youtube-monitoring">YouTube Monitoring</h2>
<p>I'm pleased to also share that we added YouTube channel monitoring to the <a href="https://nubela.co/company-monitor?ref=nubela.co">Company Monitor</a>. Your Company Monitor RSS feed will now include new YouTube videos posted by a company if they have a YouTube channel.</p>
<p>YouTube channel monitoring is enabled by default for new company targets added to the Company Monitor.</p>
<hr>
<p>Questions? Send me an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing the Employee Search Endpoint ]]></title>
        <description><![CDATA[ I am happy to introduce the Employee Search Endpoint to you today. The Employee Search API Endpoint takes a company and a job role and returns a list of employees that best match this job role. This is perfect for people looking for a list of the right people to ]]></description>
        <link>https://nubela.co/blog/introducing-the-employee-search-endpoint/</link>
        <guid isPermaLink="false">6a0bda3567f6cf0001da29e8</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 19 May 2026 11:38:14 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/employee_search.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I am happy to introduce the <a href="https://nubela.co/docs?ref=nubela.co#employee-search-endpoint">Employee Search Endpoint</a> to you today. The Employee Search API Endpoint takes a company and a job role and returns a list of employees that best match this job role. This is perfect for people looking for a list of the right people to reach out to (and prospect) in a company.</p>
<p>The data operation costs 1 credit per employee returned, with a base credit cost of <code>10</code> credits.</p>
<h2 id="sample-use-cases">Sample Use-cases</h2>
<h3 id="1-devtools-sales-%E2%80%94-i-sell-cicd-and-want-to-reach-stripes-engineering-leadership">1. DevTools sales — "I sell CI/CD and want to reach Stripe's engineering leadership"</h3>
<p>HTTP</p>
<pre><code>GET /api/v1/employee/search?company_website=stripe.com&amp;role=VP of Engineering
</code></pre>
<p><em>Cost: 3 credits | Returned 1 prospect</em></p>
<table>
<thead>
<tr>
<th><strong>Name</strong></th>
<th><strong>Role</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Chris Singleton</td>
<td>Head of Engineering / Vice President of Engineering</td>
</tr>
</tbody>
</table>
<p><strong>Why this is powerful:</strong> one API call, one decision-maker, work-email + LinkedIn-style profile both prefilled and one click away. Compare to manually scraping LinkedIn for an hour.</p>
<h3 id="2-cybersecurity-sales-%E2%80%94-i-sell-security-tooling-to-large-platforms-map-airbnbs-entire-security-org">2. Cybersecurity sales — "I sell security tooling to large platforms; map Airbnb's entire security org"</h3>
<p>HTTP</p>
<pre><code>GET /api/v1/employee/search?company_website=airbnb.com&amp;role=Head of Security
</code></pre>
<p><em>Cost: 44 credits | Returned 42 prospects across the full security buying committee</em></p>
<p>Top decision-makers:</p>
<table>
<thead>
<tr>
<th><strong>Name</strong></th>
<th><strong>Role</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Marc Blanchou</td>
<td>CISO &amp; Director of Information Security Technology</td>
</tr>
<tr>
<td>Zeeshan Khadim</td>
<td>Head of Security</td>
</tr>
<tr>
<td>Daniel Wright</td>
<td>Director of Engineering, Platform Security</td>
</tr>
<tr>
<td>Jessica Taylor</td>
<td>Director, Global Payments Security</td>
</tr>
<tr>
<td>Sarah Jenkins</td>
<td>Director of Product, Identity Verification</td>
</tr>
</tbody>
</table>
<p>Plus 37 individual contributors (Staff/Senior Security Engineers, Threat Detection, GRC, Cloud Security Architects, Threat Intel analysts, etc.) — the full security buying committee in one call.</p>
<p><strong>Why this is powerful:</strong> The role parameter expands to related variants ("Head of Security" returned CISOs, Directors of Engineering for security, IC security engineers, GRC PMs, threat intel). Sales gets the whole pod, not just the title literally typed.</p>
<h3 id="3-hr-tech-sales-%E2%80%94-i-sell-an-hris-people-ops-platform-find-the-buyer-at-notion">3. HR Tech sales — "I sell an HRIS / people-ops platform; find the buyer at Notion"</h3>
<p>HTTP</p>
<pre><code>GET /api/v1/employee/search?company_website=notion.so&amp;role=VP of People
</code></pre>
<p><em>Cost: 3 credits | Returned 1 prospect</em></p>
<table>
<thead>
<tr>
<th><strong>Name</strong></th>
<th><strong>Role</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Katy Shields</td>
<td>Chief People Officer</td>
</tr>
</tbody>
</table>
<p><strong>Why this is powerful:</strong> Sniper precision. 3 credits, one CPO, ready to outreach.</p>
<h3 id="4-geo-targeted-abm-%E2%80%94-im-running-apac-gtm-find-salesforces-singapore-sales-leadership">4. Geo-targeted ABM — "I'm running APAC GTM; find Salesforce's Singapore sales leadership"</h3>
<p>HTTP</p>
<pre><code>GET /api/v1/employee/search?company_website=salesforce.com&amp;role=Head of Sales&amp;country=SG
</code></pre>
<p><em>Cost: 5 credits | Returned 3 prospects</em></p>
<table>
<thead>
<tr>
<th><strong>Name</strong></th>
<th><strong>Role</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Paul Carvouni</td>
<td>SVP &amp; GM, ASEAN</td>
</tr>
<tr>
<td>Richard Koh</td>
<td>AVP &amp; Country Leader for Singapore</td>
</tr>
<tr>
<td>Arundhati Bhattacharya</td>
<td>President &amp; CEO, South Asia</td>
</tr>
</tbody>
</table>
<p><strong>Why this is powerful:</strong> Mix role + country for region-specific ABM — useful for partner sales, channel managers, or any APAC/EMEA-only GTM motion. Note: I tried the same <code>country=SG</code> filter on shopify.com and got <code>[]</code> (Shopify's SG presence isn't enrichable through this query), which is a useful demo that the filter is real, not just narrative.</p>
<h3 id="5-ai-martech-sales-%E2%80%94-i-sell-to-marketing-leaders-at-ai-labs-map-openais-marketing-org">5. AI martech sales — "I sell to marketing leaders at AI labs; map OpenAI's marketing org"</h3>
<p>HTTP</p>
<pre><code>GET /api/v1/employee/search?company_website=openai.com&amp;role=Head of Marketing
</code></pre>
<p><em>Cost: 17 credits | Returned 15 prospects</em></p>
<p>Top decision-makers:</p>
<table>
<thead>
<tr>
<th><strong>Name</strong></th>
<th><strong>Role</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Kate Rouch</td>
<td>Chief Marketing Officer</td>
</tr>
<tr>
<td>Gary Briggs</td>
<td>Interim Head of Marketing / CMO</td>
</tr>
<tr>
<td>Brandon McGraw</td>
<td>VP of Marketing, ChatGPT</td>
</tr>
<tr>
<td>Maggie Hott</td>
<td>Marketing VP</td>
</tr>
<tr>
<td>Dane Vahey</td>
<td>Head of B2B Marketing</td>
</tr>
<tr>
<td>Elke Karskens</td>
<td>Head of International Marketing</td>
</tr>
<tr>
<td>Kaitlin Giannetti</td>
<td>Head of Integrated Marketing Management</td>
</tr>
</tbody>
</table>
<p>Plus 8 more specialists (Product Marketing Lead, Enterprise Field Marketing Lead, GTM Startup Marketing, Regional Marketing leads for India, etc.).</p>
<p><strong>Why this is powerful:</strong> The query "Head of Marketing" returned the CMO, the VPs and the niche heads (B2B, International, Integrated, Field). For ABM playbooks targeting a department, you get the whole org chart, not just the C-suite name.</p>
<h2 id="try-it-today">Try it today!</h2>
<p>Give the Employee Search Endpoint a try today!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Supportive - Profiles in your Gmail ]]></title>
        <description><![CDATA[ There are 3 ways to get NinjaPear data today: via API, via AI (MCP server), or via the Prospector (dashboard spreadsheet UI). Today, I&#39;m very excited to share that you can now get profile data within your company email, starting with Gmail, with the Supportive extension in Chrome ]]></description>
        <link>https://nubela.co/blog/introducing-supportive-profiles-in-your-gmail/</link>
        <guid isPermaLink="false">6a0ac3560099ec000173836d</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 18 May 2026 15:50:15 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/supportive.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>There are 3 ways to get NinjaPear data today: via API, via AI (MCP server), or via the Prospector (dashboard spreadsheet UI). Today, I'm very excited to share that you can now get profile data within your company email, starting with Gmail, with the Supportive extension in <a href="http://nubela.co/supportive/chrome?ref=nubela.co">Chrome</a> or <a href="http://nubela.co/supportive/chrome?ref=nubela.co">Firefox</a>. Download it now and the first 50 users get the first 50 enrichments free!</p>
<p>This is what Supportive will look like inside your Gmail. In fact, this is what it looks like within my Gmail:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/Screenshot-2026-05-18-at-3.37.32---PM.png" class="kg-image" alt="" loading="lazy" width="2736" height="1678"><figcaption><span style="white-space: pre-wrap;">Get Profile Data inside Gmail</span></figcaption></figure><h2 id="what-is-supportive">What is Supportive?</h2>
<p>Supportive is a browser addon for Firefox and Chrome (as well as every other browser that supports Chrome-based extensions) that bolts a pane onto your Gmail that opens up every time you open an email thread. It will tell you more about the company you are chatting with and every counterparty within the email thread. It will tell you:</p>
<ul>
<li>How big the company is.</li>
<li>Where it is located.</li>
<li>Who the person you are talking to is: his role, his educational background, and where he is from.</li>
<li>What the company does.</li>
<li>And more!</li>
</ul>
<p>For those who have a little gray in the scalp like I do, you'd remember <a href="https://www.ycombinator.com/companies/rapportive?ref=nubela.co">Rapportive</a>, which NinjaPear is very much inspired by, before LinkedIn acquired and destroyed them.</p>
<h2 id="how-does-it-work">How does it work?</h2>
<p>The browser extension uses InboxSDK, which allows us to extend and interact with Gmail threads. Whenever you, the user, open an email thread, the browser extension takes every email sender, including CC'd emails, and pulls their profile data via the <a href="https://nubela.co/docs/?ref=nubela.co#person-profile-endpoint">Person Profile API Endpoint</a> and company details (from the sender's email domain) via the <a href="https://nubela.co/docs/?ref=nubela.co#company-details-endpoint">Company Details API Endpoint</a>, and has the profile data displayed right within Gmail. No googling needed. Straightforward.</p>
<h2 id="invite-everyone-it-will-not-cost-more">Invite Everyone! It will not cost more.</h2>
<p>Because we implemented caching, it means you will not be charged repeatedly for pulling the same company or person profile every time you open an email thread sent by a user you have seen before. Not just you, but everyone within your company will not be charged.</p>
<p>It does not cost extra to invite your teammates to use NinjaPear, and everyone uses the same pool of credits within an account. So <a href="https://nubela.co/dashboard/team?ref=nubela.co">invite your team members to NinjaPear</a> today and get them to download Supportive! Your cached profile data will show up for your teammates too!</p>
<h2 id="how-much-does-it-cost">How much does it cost?</h2>
<p>It does not cost extra to use NinjaPear. In fact, your first 50 enrichments are free. An enrichment is an API call.</p>
<p>Thereafter, every API call will be charged as a regular API call.</p>
<h2 id="where-is-supportive-headed">Where is Supportive Headed?</h2>
<p>In the near future, I am going to do two things:</p>
<ol>
<li>You can build and customize your own profiles for yourself and your company within Supportive, so your audience knows who you are.</li>
<li>We are going to build Supportive for Microsoft Outlook/365.</li>
</ol>
<p>I have said this since day 1 of building NinjaPear, that we intend to become the dominant first-party B2B data platform, and this is yet another gentle step in our journey of building the world's first-party competitive intelligence B2B data platform.</p>
<p>Download Supportive on <a href="http://nubela.co/supportive/chrome?ref=nubela.co">Chrome</a> or <a href="http://nubela.co/supportive/chrome?ref=nubela.co">Firefox</a> and add profiles into your Gmail!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Prospector Spreadsheets ]]></title>
        <description><![CDATA[ You can now pull all of NinjaPear&#39;s data through the Prospector Spreadsheets without running any code. Here is a quick demo of how it works:



I designed and built the NinjaPear Prospector because it bothered me that most NinjaPear users are API users. Surely there are people who ]]></description>
        <link>https://nubela.co/blog/introducing-prospector-spreadsheets/</link>
        <guid isPermaLink="false">6a0683960099ec0001738336</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 15 May 2026 10:39:07 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/prospector.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>You can now pull all of NinjaPear's data through the Prospector Spreadsheets without running any code. Here is a quick demo of how it works:</p>
<iframe src="https://nubela.co/widget/prospector" width="100%" height="680" style="border:0; max-width:100%;" loading="lazy" title="NinjaPear Prospector live demo"></iframe>
<p>I designed and built the NinjaPear Prospector because it bothered me that most NinjaPear users are API users. Surely there are people who would be intrigued by the data and just need a quick export, and do not want to write code. What if NinjaPear was just too hard to use?</p>
<h2 id="prospector-design-process">Prospector Design Process</h2>
<h3 id="spreadsheet-paradigm">Spreadsheet Paradigm</h3>
<p>There are universal paradigms that everyone is familiar with:</p>
<ul>
<li>Spreadsheets - Clay, Excel, Google Sheets</li>
<li>Kanban - Trello</li>
<li>Text editing - Claude, WhatsApp, Microsoft Word</li>
<li>Slides - PowerPoint</li>
</ul>
<p>Given the success of Clay, the spreadsheet paradigm was an immediate fit for the Prospector.</p>
<h3 id="sheet-level-actions-sheet-types-and-column-actions">Sheet-level Actions, Sheet Types, and Column Actions</h3>
<p>But a few problems remained. Data isn't always flat, and that means the spreadsheet isn't always an obvious fit. For example, a detailed company profile might contain multiple addresses per company. Or a person profile would have multiple work history records. How can we represent this data as a row (or multiple rows) in a spreadsheet?</p>
<p>To solve the problem of nested data structures, we employed two methods:</p>
<ol>
<li>Sheet-level actions, and</li>
<li>Sheet types.</li>
</ol>
<p>Sheet-level actions allow you to fetch a specific data type which spans multiple rows per record from a parent spreadsheet into a child spreadsheet that will contain the subsidiary data. For example, you can get a new spreadsheet of "Work History" out of a spreadsheet of people profiles.</p>
<p>And because Work History has different data columns than people profiles, they get their own "type" of spreadsheet. Hence, sheet types.</p>
<p>There is also data that we return that is scalar in nature. For example, the <em>employee count</em> of a company. These belong as regular enrichable columns in the Company Sheets. And these regular scalar data operations come in the form of the more commonly accepted "+ Column" actions that we are familiar with in regular spreadsheets.</p>
<h3 id="streaming-results">Streaming Results</h3>
<p>On top of that, our data pipeline process is a live enrichment process. We are not reading off a database, so our users—you—get the freshest data possible. This means it takes time to enrich one record at a time, ranging from around 10 seconds per <a href="https://www.google.com/search?q=https://nubela.co/docs%23company-details-endpoint&ref=nubela.co">company</a>/<a href="https://nubela.co/docs?ref=nubela.co#person-profile-endpoint">person</a> profile to about a minute for similar people records. How can we bulk enrich a spreadsheet with many rows without keeping the user waiting? What if the user closes the spreadsheet tab while waiting?</p>
<p>To solve this problem, we do two things:</p>
<ol>
<li>All sheet-level data operations go into the backend and are operated on asynchronously.</li>
<li>Results are streamed back row by row.</li>
</ol>
<p>So while the whole spreadsheet might take some time to fully enrich, the user will actually see that things are moving in the background.</p>
<p>In fact, the user is given the option to abort the bulk background enrichment anytime in the UI, and—poof—it shuts off. People make mistakes; we need to allow people to stop their credits from being burnt.</p>
<h3 id="export-as-csv-or-xlsx">Export as CSV or XLSX</h3>
<p>And when you are done with the enrichment, you can download the enriched spreadsheet into your favourite CSV/XLSX format.</p>
<h2 id="getting-started-with-the-prospector">Getting Started with the Prospector</h2>
<p>You can get started with the Prospector in NinjaPear's dashboard here. Give it a try! You no longer need to use the API to build up datasets, particularly for one-time quick enrichments.</p>
<p>The Prospector is a very new and raw feature and is not battle-tested. If you come across any bugs, do send over a bug report to <a href="mailto:hello@nubela.co">hello@nubela.co</a>. I look forward to having more non-API users adopt NinjaPear into their B2B data enrichment toolset!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Updates to Rate Limits and Caching ]]></title>
        <description><![CDATA[ I pushed a huge NinjaPear update yesterday, and it has four parts to it. I will talk about two items in this update for the first part that will immediately affect your use of NinjaPear: caching and rate limits.



Rate Limits


Let&#39;s start with the bad news first. ]]></description>
        <link>https://nubela.co/blog/updates-to-rate-limits-and-caching/</link>
        <guid isPermaLink="false">6a04482c0099ec0001738317</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 13 May 2026 17:50:58 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/ratelimits.png" medium="image"/>
        <content:encoded><![CDATA[ <p>I pushed a huge NinjaPear update yesterday, and it has four parts to it. I will talk about two items in this update for the first part that will immediately affect your use of NinjaPear: <em>caching</em> and <em>rate limits</em>.</p>
<h2 id="rate-limits">Rate Limits</h2>
<p>Let's start with the bad news first. I have implemented rate limits and also reduced them.</p>
<p><strong>Rate limits are now live in NinjaPear</strong>. While <a href="https://nubela.co/docs?ref=nubela.co#rate-limit">rate limits are documented</a> in our API documentation, they were never fully implemented, mostly because we did not have many users. Three months in, there have been a handful of instances where the NinjaPear service was taken down by a sudden deluge of concurrent API requests. In fact, it literally just happened.</p>
<p>I have also <strong>reduced rate limits from 300 requests/minute to 50 requests/minute</strong> for API endpoints that you pay for with credits. For the most part, almost no one will be affected other than a handful of you.</p>
<p>What has been nerfed severely are the free API endpoints, such as the <a href="https://nubela.co/logo?ref=nubela.co">Company Logo API</a> or the <a href="https://nubela.co/disposable-email?ref=nubela.co">Disposable Email Checker API</a>. These <strong>free tools will now have a rate limit of 2 requests/minute for free/trial tiers</strong>.</p>
<p>To sustainably provide free APIs, the rate limit for free APIs now depends on your subscription plan:</p>
<ul>
<li>Free, trial, or PAYG plan: 2 requests/min</li>
<li>$49/mo plan: 20 requests/min</li>
<li>$299/mo plan: 50 requests/min</li>
<li>$899/mo plan: 100 requests/min</li>
<li>$1899/mo plan: 300 requests/min</li>
</ul>
<p>The free API rate limit applies to Company Logo, Disposable Email Checker, View Credit Balance, and RSS feed consumption.</p>
<p>Sorry about this. These free API requests were consuming compute resources that weren't doing anything for us—no marketing, no attribution, and no user growth—while causing a couple of downtime issues. So, I made a conscious decision to stop supporting users who do not pay us. That said, if you're on a subscription—as many of you are—feel free to enjoy our free services, which will continue to cost you zero credits!</p>
<h2 id="caching">Caching</h2>
<p>On to the good news! There is now a user-controllable caching system which will:</p>
<ol>
<li>Reduce the latency of cached responses</li>
<li>Reduce your credit usage</li>
<li>Allow you to manage profile freshness</li>
</ol>
<p>For the following API endpoints, there is now a <code>use_cache</code> parameter:</p>
<table>
<thead>
<tr>
<th><strong>Endpoint</strong></th>
<th><strong>Default</strong></th>
<th><strong>Freshness window</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>GET /api/v1/customer/listing</td>
<td>if-present</td>
<td>29 days</td>
</tr>
<tr>
<td>GET /api/v1/competitor/listing</td>
<td>if-present</td>
<td>29 days</td>
</tr>
<tr>
<td>GET /api/v1/company/details</td>
<td>if-recent</td>
<td>29 days</td>
</tr>
<tr>
<td>GET /api/v1/company/employee-count</td>
<td>if-recent</td>
<td>29 days</td>
</tr>
<tr>
<td>GET /api/v1/company/updates</td>
<td>if-recent</td>
<td>1 day</td>
</tr>
<tr>
<td>GET /api/v1/company/funding</td>
<td>if-recent</td>
<td>29 days</td>
</tr>
<tr>
<td>GET /api/v1/employee/profile</td>
<td>if-recent</td>
<td>29 days</td>
</tr>
<tr>
<td>GET /api/v1/employee/search</td>
<td>if-recent</td>
<td>29 days</td>
</tr>
</tbody>
</table>
<p>The <code>use_cache</code> parameter controls the freshness of the data you receive, with the side effect of reducing your credit costs. This is how it works and the values that the <code>use_cache</code> parameter accepts:</p>
<ul>
<li><code>use_cache=if-recent</code> — Returns a response no older than 29 days (the freshness window might differ, but most API endpoints use 29 days). If you paid for the initial fresh response, calling the same API endpoint with the same parameters any time within those 29 days will return the cached value <strong>at no additional credit cost</strong>.
<ul>
<li>This is perfect for cases where you want "fresh-ish" data and might need to call it repeatedly from the cache with as little latency as possible without incurring additional costs.</li>
</ul>
</li>
<li><code>use_cache=if-present</code> — Returns a cached response if it exists in the cache. You only pay the first time you fetch it. Thereafter, you do not have to pay for it as long as the response remains in the cache (which is ideally forever).
<ul>
<li>This is perfect for cases when you do not care about freshness or want to minimize cost while getting results as fast as possible.</li>
</ul>
</li>
<li><code>use_cache=never</code> — Never use the cache! This always performs a live enrichment, and you will be charged every time.</li>
</ul>
<p>With this update, the average user is expected to spend less on NinjaPear.</p>
<p>Cache control for the win.</p>
<h3 id="the-usecache-lore">The <code>use_cache</code> lore</h3>
<p>I used to run Proxycurl, the largest LinkedIn scraper. We implemented the <code>use_cache</code> parameter because there was a subset of popular profiles that were constantly being requested. The Pareto principle applies. We did not want to keep hitting LinkedIn with the same scraping request, so we implemented the <code>use_cache</code> parameter to limit hits to one profile scrape per month, at most. We never allowed users to have live enrichment at will because that would expose our scraping methodology or resources.</p>
<p>Of course, internally, we had a secret parameter that forced a live LinkedIn scrape, which we used for debugging our data extraction pipeline since LinkedIn changes their website all the time!</p>
<p>Now that we <strong>do not</strong> scrape LinkedIn, we offer live enrichment as an option at all times with no additional cost! Now you know :)</p>
<h2 id="part-2-updates-tomorrow">Part 2 Updates Tomorrow</h2>
<p>I will not flood you with too many changes in one update; I will share Part 2 tomorrow. Oh, and there is also a good reason why I implemented the <code>use_cache</code> parameter: latency. We needed good data-retrieval latency for a hot feature that we will be announcing soon.</p>
<p>I will keep you posted!</p>
<p>As usual, if you have any questions, shoot me an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>! I reply to all emails personally!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How To Find Anyone With An Advanced LinkedIn People Search ]]></title>
        <description><![CDATA[ LinkedIn people search still works when the query is simple and specific. In this guide, I’m going to show you the five search workflows that still hold up: search by name, name plus company, name plus location, role plus company, and role plus location. I’ll also show you ]]></description>
        <link>https://nubela.co/blog/advanced-linkedin-people-search/</link>
        <guid isPermaLink="false">69f354f48420610001073ac6</guid>
        <category><![CDATA[ linkedin people search ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Thu, 30 Apr 2026 21:11:16 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_17-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>LinkedIn people search still works when the query is simple and specific. In this guide, I’m going to show you the five search workflows that still hold up: search by name, name plus company, name plus location, role plus company, and role plus location. I’ll also show you where LinkedIn search gets weak, what to do after you find the right person, and when to stop doing this manually.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/linkedin</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/SumOfChemicals</span>
<span style="color:#878a8c;">· ▲ 8</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">My most frequent workflow is to go to a company's account page, click on the number of employees at the top which then gives the search showing current employees, and then I filter by the title I need. With this change, the list of company employees is relatively useless because I can't narrow it down...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/linkedin/comments/1owe5jy/have_you_figured_out_a_replacement_for_the/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="why-this-still-matters">Why this still matters</h2>
<p>Most people using LinkedIn people search are trying to find one actual person.</p>
<p>Usually that means one of these:</p>
<ul>
<li>a recruiter finding candidates</li>
<li>a sales rep finding the right buyer</li>
<li>a founder finding investors or operators</li>
<li>a journalist verifying a person before outreach</li>
</ul>
<p>There are still two real routes:</p>
<ol>
<li>Search inside LinkedIn.</li>
<li>Search on Google and land on LinkedIn anyway.</li>
</ol>
<p>This guide keeps the five workflows from <a href="https://nubela.co/blog/how-to-find-anyone-with-an-advanced-linkedin-people-search/">our older LinkedIn people search post</a>, because that piece got the practical part right.</p>
<h2 id="search-by-name">Search by name</h2>
<p>Use this when you know the exact person’s full name.</p>
<h3 id="step-by-step">Step by step</h3>
<ol>
<li>Type the full name into LinkedIn search.</li>
<li>Click the <strong>People</strong> tab.</li>
<li>If results are messy, wrap the full name in quotes.</li>
<li>Scan the tighter result set.</li>
</ol>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin:18px 0;">
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Ryan-Reynolds-1-blurred-1-6892a783.webp" alt="LinkedIn people search for Ryan Reynolds before using quotes" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 1: Search the full name and switch to <strong>People</strong>.</figcaption>
  </figure>
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Ryan-Reynolds-2-blurred-1-23562d7f.webp" alt="LinkedIn people search for Ryan Reynolds with quotes to reduce noise" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 2: Search <code>"ryan reynolds"</code>. In the original walkthrough, this cut results from about <strong>1,200</strong> to <strong>767</strong>.</figcaption>
  </figure>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If the name is still too common after quotes, do not keep scrolling. Add company or location.</p>
<h2 id="search-by-name-and-company">Search by name and company</h2>
<p>Use this when you know the name and the employer.</p>
<h3 id="step-by-step">Step by step</h3>
<ol>
<li>Search the person’s name.</li>
<li>Add the company name.</li>
<li>Look for the employer context directly in the result.</li>
</ol>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin:18px 0;">
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Amy-Hood-1-blurred-1-fdb64ed3.webp" alt="LinkedIn people search for Amy Hood by name only" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 1: Start with <code>amy hood</code>.</figcaption>
  </figure>
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Amy-Hood-2-blurred-1-bc6b5583.webp" alt="LinkedIn people search for Amy Hood with Microsoft added" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 2: Add company context, <code>amy hood microsoft</code>. The result becomes easier to verify because LinkedIn shows the Microsoft CFO context directly.</figcaption>
  </figure>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you know the company, use it. This is the fastest way to confirm the right person.</p>
<h2 id="search-by-name-and-location">Search by name and location</h2>
<p>Use this when the name alone is not unique enough.</p>
<h3 id="step-by-step">Step by step</h3>
<ol>
<li>Search the name first.</li>
<li>Add a location filter or location keyword.</li>
<li>Review the narrower list.</li>
</ol>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin:18px 0;">
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Elbayakan-1-blurred-1-a82fe4ae.webp" alt="LinkedIn people search for Elbakyan before location filtering" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 1: Search <code>elbakyan</code>.</figcaption>
  </figure>
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Elbayakan-2-blurred-2-9df44a58.webp" alt="LinkedIn people search for Elbakyan filtered by Kazakhstan" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 2: Filter by <strong>Kazakhstan</strong> to narrow the list hard.</figcaption>
  </figure>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Location usually cuts the result set faster than vague title words.</p>
<h2 id="search-by-role-and-company">Search by role and company</h2>
<p>Use this when you want employees at one company with a specific title.</p>
<h3 id="step-by-step">Step by step</h3>
<ol>
<li>Put the multi-word title in quotes.</li>
<li>Add the company with <code>AND</code>.</li>
<li>Review the results for current title plus company matches.</li>
</ol>
<p>Search:</p>
<pre><code class="language-text">&quot;software engineer&quot; AND apple
</code></pre>
<p><img alt="LinkedIn people search by role and company using Boolean" src="https://f000.backblazeb2.com/file/agent-pub-filestore/SWE-Apple-1-blurred-1-d9ccc476.webp" /></p>
<p>That is still the cleanest move for this workflow.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/linkedin</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/BaxterAglaminkus</span>
<span style="color:#878a8c;">· ▲ 0</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">their new AI people search is <em>atrociously awful</em>, returning junky, irrelevant results and missing legitimate results altogether.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/linkedin/comments/1skfcn3/why_has_linkedin_changed_their_search_filters_for/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That complaint is fair. Broad search gets sloppy fast. Quotes plus Boolean still help.</p>
<h2 id="search-by-role-and-location">Search by role and location</h2>
<p>Use this when you want to find a type of person in a geography, like founders in a city or region.</p>
<h3 id="step-by-step">Step by step</h3>
<ol>
<li>Start with a broad role cluster.</li>
<li>Filter by location.</li>
<li>Spot the junk.</li>
<li>Exclude it with <code>NOT</code>.</li>
</ol>
<p>Start with:</p>
<pre><code class="language-text">tech AND founder
</code></pre>
<p>Then tighten with either:</p>
<pre><code class="language-text">NOT investor AND (tech AND founder)
</code></pre>
<p>or:</p>
<pre><code class="language-text">NOT investor AND tech AND founder
</code></pre>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin:18px 0;">
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Tech-founder-1-blurred-1-bb9ec688.webp" alt="Broad LinkedIn people search for tech founders by location" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 1: Start broad with founders in the target location.</figcaption>
  </figure>
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Tech-founder-2-blurred-1-5b391fba.webp" alt="LinkedIn people search improved by excluding investors with NOT" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Step 2: Remove investor noise with <code>NOT investor</code>.</figcaption>
  </figure>
</div>

<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/linkedin</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Curiosity_Is_Burning</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Yep, this suddenly changed an hour ago on my Prem job seeker account. It is a nightmare. One primary use I employ is after checking out a job at a company, I search on title keywords of their employees. This shows me who I would be working with and reporting to in this job at that company...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/linkedin/comments/1owe5jy/have_you_figured_out_a_replacement_for_the/nopkgq2/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="what-to-do-after-you-find-them">What to do after you find them</h2>
<p>Finding the profile is not the finish line.</p>
<p>Usually the next question is one of these:</p>
<ul>
<li>did I find the right person?</li>
<li>are they still at that company?</li>
<li>do I need one profile or a lot of them?</li>
<li>am I going to repeat this every week?</li>
</ul>
<p>If it is one person once, manual LinkedIn is enough.</p>
<p>If it is a repeated workflow, manual LinkedIn people search turns into dumb labor fast.</p>
<h2 id="beware-the-search-limit">Beware the search limit</h2>
<p><a href="https://nubela.co/blog/how-to-find-anyone-with-an-advanced-linkedin-people-search/">Our older LinkedIn people search post</a> warned about this, and the warning still stands: if you do a lot of profile clicking and repeated employee hunting, LinkedIn search gets annoying fast.</p>
<p>The old guide showed both the vague monthly-search warning and the hard stop screen. Here they are, because this part has not gotten friendlier.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin:18px 0;">
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Search-limit-blurred-1-ae13ce70.webp" alt="LinkedIn people search monthly usage warning" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Warning screen: LinkedIn tells you a monthly people-search usage limit exists, but does not tell you the exact remaining number.</figcaption>
  </figure>
  <figure style="margin:0;">
    <img src="https://f000.backblazeb2.com/file/agent-pub-filestore/Search-limit-reached-blurred-1-1334ab37.webp" alt="LinkedIn people search limit reached screen" style="width:100%;border-radius:8px;">
    <figcaption style="font-size:14px;color:#555;margin-top:6px;">Limit reached: this is where manual LinkedIn people search stops being a workflow and starts being a bottleneck.</figcaption>
  </figure>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>LinkedIn’s help page says you can enter “your keyword(s) or a natural language query” and include company, role, title, or location directly in the search bar. The same page also says: “Don't use any quotes in your search query, because natural language search does not support quotes. If you prefer exact keyword matching, you can use Boolean search instead.” That is why quotes and Boolean still matter in this guide.</p>
<p>LinkedIn’s relevance documentation also says people-search results are personalized and “unique to each member” based on the query and the searcher’s context. That means the same query can rank differently for different users.</p>
<p>That is fine for browsing. It is bad for repeatable systems.</p>
<h2 id="search-at-scale-instead">Search at scale instead</h2>
<p>The old article recommended Proxycurl. That recommendation is dead, because Proxycurl is dead. The shutdown note is here: <a href="https://nubela.co/blog/goodbye-proxycurl/">Goodbye Proxycurl</a>.</p>
<p>So here is the modern recommendation plainly: use NinjaPear when LinkedIn people search stops being a one-off task and starts becoming a repeated process.</p>
<p>NinjaPear is not LinkedIn search. Good. It gives you people search and employee search via API from public web sources, and its docs are explicit that it does <strong>not</strong> scrape social media platforms. That matters. If you want the legal angle spelled out, read Steven’s piece on <a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">whether scraping LinkedIn is legal in 2026</a>. Building an important workflow on legal gray crap is a bad idea.</p>
<p>Here is the practical decision table.</p>
<table>
<thead>
<tr>
<th>Use case</th>
<th>Manual LinkedIn</th>
<th>Person Profile Endpoint</th>
<th>Employee Search Endpoint</th>
<th>Best choice</th>
</tr>
</thead>
<tbody>
<tr>
<td>Find one person one-off</td>
<td>Fast and good enough</td>
<td>Overkill unless you need structure</td>
<td>Wrong tool</td>
<td>Manual LinkedIn</td>
</tr>
<tr>
<td>Verify a person by company</td>
<td>Decent</td>
<td>Best fit</td>
<td>Weak fit</td>
<td>Person Profile</td>
</tr>
<tr>
<td>Find many employees by title</td>
<td>Slow and noisy</td>
<td>Weak fit</td>
<td>Best fit</td>
<td>Employee Search</td>
</tr>
<tr>
<td>Repeat the same search weekly</td>
<td>Fragile</td>
<td>Good for one-person refreshes</td>
<td>Best fit</td>
<td>Employee Search</td>
</tr>
</tbody>
</table>
<h2 id="use-person-profile-for-one-person">Use Person Profile for one person</h2>
<p>Use the <a href="https://nubela.co/docs?ref=nubela.co#person-profile-endpoint">Person Profile Endpoint</a> when you already know roughly who the person is and want a structured answer.</p>
<p>Good inputs:</p>
<ul>
<li>work email</li>
<li>name + company</li>
<li>role + company</li>
</ul>
<p>Short example:</p>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/employee/profile&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot; \
  --data-urlencode &quot;name=Patrick Collison&quot; \
  --data-urlencode &quot;employer_website=stripe.com&quot;
</code></pre>
<p>What this does: it resolves one person from <code>name + company</code> and returns a structured profile instead of a messy search page.</p>
<h2 id="use-employee-search-for-many-people">Use Employee Search for many people</h2>
<p>Use the <a href="https://nubela.co/docs?ref=nubela.co#employee-search-endpoint">Employee Search Endpoint</a> when you want many current employees at a company and need a repeatable workflow.</p>
<p>This is the upgrade path for:</p>
<ul>
<li>recruiting into one account</li>
<li>sales prospecting into a target company</li>
<li>market mapping a team</li>
<li>repeating the same role search every week</li>
</ul>
<p>Short example:</p>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/employee/search&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot; \
  --data-urlencode &quot;company=apple.com&quot; \
  --data-urlencode &quot;role=software engineer&quot; \
  --data-urlencode &quot;page_size=10&quot;
</code></pre>
<p>What this does: it searches for employees at one company by role and gives you structured results you can reuse.</p>
<p>That is the key difference. Manual LinkedIn search gives you a browsing experience. NinjaPear gives you a repeatable system.</p>
<h2 id="my-final-recommendation">My final recommendation</h2>
<p>Use manual LinkedIn people search when you need one person and you need them now.</p>
<p>Use Person Profile Endpoint when you want a structured profile for one person.</p>
<p>Use Employee Search Endpoint when you need many people at one company.</p>
<p>And if you are repeating the same LinkedIn people search every week, stop doing that to yourself. Move the workflow into NinjaPear and get on with your week.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ What Is Proxycurl API Now in 2026? I&#x27;m the founder. ]]></title>
        <description><![CDATA[ I am the founder of Proxycurl, and if you do not know it yet, I have shut Proxycurl down and NinjaPear is what comes after Proxycurl. If you are searching for proxycurl api in 2026, the practical question is not whether it still works. It does not. The practical question ]]></description>
        <link>https://nubela.co/blog/what-is-proxycurl-api-now-in-2026-im-the-founder/</link>
        <guid isPermaLink="false">69f1f7278420610001073aa5</guid>
        <category><![CDATA[ proxycurl api ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 29 Apr 2026 20:18:48 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_16-2.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>I am the founder of Proxycurl, and if you do not know it yet, I have shut Proxycurl down and NinjaPear is what comes after Proxycurl. If you are searching for <strong>proxycurl api</strong> in 2026, the practical question is not whether it still works. It does not. The practical question is which Proxycurl API workflow you were trying to use, and whether NinjaPear now solves that workflow better. This guide covers the status, the old API groups, why the product was killed, and the technical replacement paths I would use now.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/n8n</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/spacegeekOps</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I used to rely on Proxycurl for pulling enriched B2B contact and company data... Unfortunately, they shut down recently.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/n8n/comments/1myqu0v/looking_for_a_good_alternative_to_proxycurl_they/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="why-was-proxycurl-shut-down">Why was Proxycurl shut down?</h2>
<p>Proxycurl was shut down because LinkedIn sued us in January 2025. I wrote that in the <a href="https://nubela.co/blog/goodbye-proxycurl/">shutdown post</a>: <strong>"In January earlier this year (2025), LinkedIn filed a lawsuit against Proxycurl. Today, we are shutting Proxycurl down."</strong></p>
<p>Even though we settled, we do not want customers to carry a legal risk forward with an adversary like LinkedIn with near unlimited resources. That is why NinjaPear exists.</p>
<p><img alt="Proxycurl shutdown post" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/ba29b02b9f03-2.webp" /></p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/n8n</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Beneficial-Bonus-102</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I avoid relying on solutions who might be down any time honestly.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/n8n/comments/1myqu0v/looking_for_a_good_alternative_to_proxycurl_they/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="what-proxycurl-api-is-now">What Proxycurl API is now</h2>
<p>Proxycurl is shut down. Old docs, old blog posts, and old code samples still exist. Treat them as historical reference only.</p>
<h2 id="what-was-proxycurl-api">What was Proxycurl API?</h2>
<p>Proxycurl API was a set of developer APIs for getting structured people and company data, much of it keyed off LinkedIn URLs as the canonical identifier for entities, people or companies. As the founder, I have got to be honest: ~50% of revenue came from scraping LinkedIn. That is exactly why the legal risk was existential.</p>
<p>The simplest way to understand Proxycurl is by the jobs each endpoint did.</p>
<ul>
<li>Get a person’s structured professional profile from a LinkedIn URL with the <strong>Person Profile Endpoint</strong>.</li>
<li>Resolve a person from a name plus company with the <strong>Person Lookup Endpoint</strong>.</li>
<li>Find the likely decision maker at a company with the <strong>Role Lookup Endpoint</strong>.</li>
<li>Search for people with filters like country, past company, and title with the <strong>Person Search Endpoint</strong>.</li>
<li>Get a company’s structured profile from its LinkedIn company URL with the <strong>Company Profile Endpoint</strong>.</li>
<li>Resolve a company from its name with the <strong>Company Lookup Endpoint</strong>.</li>
<li>Get the employee count of a company with the <strong>Employee Count Endpoint</strong>.</li>
<li>Get a company logo with the <strong>Company Profile Picture Endpoint</strong>.</li>
<li>List current or past employees of a company with the <strong>Employee Listing Endpoint</strong>.</li>
<li>Count how many employees a company had in the public dataset with the <strong>Employee Listing Count Endpoint</strong>.</li>
<li>Search employees inside a company with the <strong>Employee Search Endpoint</strong>.</li>
<li>Find a work email with the <strong>Work Email Lookup Endpoint</strong>.</li>
<li>Reverse a work email back to a person or company with the <strong>Reverse Work Email Lookup Endpoint</strong>.</li>
<li>Find a personal email with the <strong>Personal Email Lookup Endpoint</strong>.</li>
<li>Find a personal phone number with the <strong>Personal Contact Number Lookup Endpoint</strong>.</li>
<li>Get a person’s profile picture with the <strong>Person Profile Picture Endpoint</strong>.</li>
<li>Run lightweight checks such as disposable email detection with utility endpoints.</li>
</ul>
<p>That was the real product. A pile of specific endpoints developers used to enrich CRMs, build outbound tools, source candidates, and power internal search.</p>
<h2 id="the-api-groups-and-endpoints">The API groups and endpoints</h2>
<h3 id="people-api">People API</h3>
<p>The People API handled person resolution, enrichment, search, and profile assets.</p>
<p>Representative endpoints:</p>
<ul>
<li><code>Person Profile Endpoint</code></li>
<li><code>Person Lookup Endpoint</code></li>
<li><code>Role Lookup Endpoint</code></li>
<li><code>Person Search Endpoint</code></li>
<li><code>Person Profile Picture Endpoint</code></li>
</ul>
<p>What engineers used it for:</p>
<ul>
<li>enrich a lead from a LinkedIn URL</li>
<li>turn a name plus company into a canonical profile</li>
<li>find a VP Sales, CTO, or recruiter at a target account</li>
<li>search for prospects by role history or geography</li>
<li>add a profile photo to a UI</li>
</ul>
<p>Why it worked: the response shape was simple, the docs were clear, and the LinkedIn URL made a convenient canonical key.</p>
<p>Why it was fragile: if the canonical object in your architecture is a LinkedIn URL, your whole system is downstream of LinkedIn.</p>
<h3 id="company-api">Company API</h3>
<p>The Company API handled company identity, enrichment, and count-style lookups.</p>
<p>Representative endpoints:</p>
<ul>
<li><code>Company Profile Endpoint</code></li>
<li><code>Company Lookup Endpoint</code></li>
<li><code>Employee Count Endpoint</code></li>
<li><code>Company Profile Picture Endpoint</code></li>
</ul>
<p>What engineers used it for:</p>
<ul>
<li>enrich company records in a CRM</li>
<li>estimate account size before routing or scoring</li>
<li>attach company logos to records</li>
<li>resolve messy company names to a canonical entity</li>
</ul>
<p>This part of Proxycurl was less dramatic than the people side. The object was the company. But the same dependency still sat underneath when LinkedIn company URLs were part of the workflow.</p>
<h3 id="contact-api">Contact API</h3>
<p>The Contact API handled reachability.</p>
<p>Representative endpoints:</p>
<ul>
<li><code>Work Email Lookup Endpoint</code></li>
<li><code>Reverse Work Email Lookup Endpoint</code></li>
<li><code>Personal Email Lookup Endpoint</code></li>
<li><code>Personal Contact Number Lookup Endpoint</code></li>
</ul>
<p>What engineers used it for:</p>
<ul>
<li>append work email to a lead</li>
<li>find a personal fallback email</li>
<li>add a phone number to an outbound sequence</li>
<li>reverse-resolve an email already sitting in a CRM</li>
</ul>
<p>One technical point matters here: these fields were not literally scraped from LinkedIn profiles. They came from other sources tied back to the identity object.</p>
<h3 id="employee-listing-api">Employee Listing API</h3>
<p>This was one of the most commercially useful parts of Proxycurl.</p>
<p>Representative endpoints:</p>
<ul>
<li><code>Employee Listing Endpoint</code></li>
<li><code>Employee Listing Count Endpoint</code></li>
<li><code>Employee Search Endpoint</code></li>
</ul>
<p>What engineers used it for:</p>
<ul>
<li>list employees at a target account</li>
<li>find current or past employees of a competitor</li>
<li>build account plans around named people</li>
<li>source candidates from specific orgs</li>
</ul>
<p>The economics were explicit in old docs. Employee Listing was priced at <strong>5 credits per employee returned</strong> with a <strong>10-credit minimum</strong>. Employee Listing Count was <strong>10 credits per call</strong>. That alone tells you this was a heavy endpoint backed by heavy infrastructure.</p>
<h3 id="search-api">Search API</h3>
<p>The Search API was the headless prospecting surface.</p>
<p>Representative endpoints:</p>
<ul>
<li><code>Person Search Endpoint</code></li>
<li><code>Company Search Endpoint</code></li>
</ul>
<p>What engineers used it for:</p>
<ul>
<li>build prospect lists from filters</li>
<li>source candidates from competitor companies</li>
<li>create segments by role, geo, or experience</li>
<li>power search inside internal tools</li>
</ul>
<p>One Proxycurl write-up referenced <strong>46 filters</strong> on Person Search. That is why people liked it. You could treat it like programmable Sales Navigator.</p>
<h3 id="utility-endpoints">Utility endpoints</h3>
<p>These were the small but useful endpoints.</p>
<p>Representative endpoints:</p>
<ul>
<li><code>Person Profile Picture Endpoint</code></li>
<li><code>Company Profile Picture Endpoint</code></li>
<li>disposable email checks</li>
<li>smaller validation helpers</li>
</ul>
<p>What engineers used them for:</p>
<ul>
<li>clean up product UI</li>
<li>block throwaway signups</li>
<li>enrich records without paying for a bigger call</li>
</ul>
<h2 id="ninjapear-api-comes-after-proxycurl-api-by-the-same-founder">NinjaPear API comes after Proxycurl API, by the same founder</h2>
<p>NinjaPear is the API platform I built after Proxycurl.</p>
<p>It does not scrape LinkedIn.</p>
<p>It is built around different primitives:</p>
<ul>
<li>companies</li>
<li>employees from public sources</li>
<li>customers</li>
<li>competitors</li>
<li>updates and monitoring feeds</li>
</ul>
<p>The easiest way to understand NinjaPear is the same way.</p>
<ul>
<li>Get a list of customers, investors, and partners of any company with the <a href="https://nubela.co/docs/?ref=nubela.co#customer-listing-endpoint">Customer Listing Endpoint</a>.</li>
<li>Find competitors of any company and why they compete with the <a href="https://nubela.co/docs/?ref=nubela.co#competitor-listing-endpoint">Competitor Listing Endpoint</a>.</li>
<li>Get the logo of any company for free with the <a href="https://nubela.co/docs/?ref=nubela.co#company-logo-endpoint">Company Logo Endpoint</a>.</li>
<li>Get full company details like industry, description, executives, and office locations with the <a href="https://nubela.co/docs/?ref=nubela.co#company-details-endpoint">Company Details Endpoint</a>.</li>
<li>Get the employee count of any company with the <a href="https://nubela.co/docs/?ref=nubela.co#employee-count-endpoint">Employee Count Endpoint</a>.</li>
<li>Get recent blog posts and social media updates of any company with the <a href="https://nubela.co/docs/?ref=nubela.co#company-updates-endpoint">Company Updates Endpoint</a>.</li>
<li>Get the full funding history and investors of any company with the <a href="https://nubela.co/docs/?ref=nubela.co#company-funding-endpoint">Company Funding Endpoint</a>.</li>
<li>Resolve a company name to its canonical website URL with the <a href="https://nubela.co/docs/?ref=nubela.co#website-lookup-endpoint">Website Lookup Endpoint</a>.</li>
<li>Find the work email of a person given their name and company domain with the <a href="https://nubela.co/docs/?ref=nubela.co#work-email-endpoint">Work Email Endpoint</a>.</li>
<li>Look up a person's profile, job history, and education from their work email with the <a href="https://nubela.co/docs/?ref=nubela.co#person-profile-endpoint">Person Profile Endpoint</a>.</li>
<li>Find people similar to a target person, same role at competing companies, with the <a href="https://nubela.co/docs/?ref=nubela.co#similar-people-endpoint">Similar People Endpoint</a>.</li>
<li>Check if an email address is disposable or from a free email provider with the <a href="https://nubela.co/docs/?ref=nubela.co#disposable-email-checker-endpoint">Disposable Email Checker Endpoint</a>.</li>
<li>Monitor companies for new blog posts, tweets, and website changes via RSS with the <a href="https://nubela.co/docs/?ref=nubela.co#monitor-api">Monitor API</a>.</li>
<li>Check your remaining API credits with the <a href="https://nubela.co/docs/?ref=nubela.co#view-credit-balance-endpoint">View Credit Balance Endpoint</a>.</li>
</ul>
<p>Current product surfaces shown on the site include <a href="https://nubela.co/companies?ref=nubela.co">Customer API</a>, <a href="https://nubela.co/companies?ref=nubela.co">Company API</a>, <a href="https://nubela.co/companies?ref=nubela.co">Employee API</a>, <a href="https://nubela.co/companies?ref=nubela.co">Monitor API</a>, and <a href="https://nubela.co/companies?ref=nubela.co">Competitor API</a>.</p>
<p><img alt="NinjaPear API surface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/b0570c197ef5-2.webp" /></p>
<p>A few current numbers matter:</p>
<ul>
<li><strong>Company Details</strong>: 2 credits per call</li>
<li><strong>Employee Count</strong>: 2 credits per call</li>
<li><strong>Company Updates</strong>: 2 credits per call</li>
<li><strong>Company Funding</strong>: 2+ credits per call</li>
<li><strong>Customer Listing</strong>: 1 credit per request + 2 credits per customer returned</li>
<li><strong>3-day free trial</strong>: 10 credits included</li>
</ul>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/n8n</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/nubela</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Ex-CEO of Proxycurl here. I built NinjaPear after shutting Proxycurl down. It does not scrape LinkedIn and it is built around companies, customers, competitors, employee profiles from public sources, and monitoring.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/n8n/comments/1myqu0v/looking_for_a_good_alternative_to_proxycurl_they/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>This is a broader data model than Proxycurl had. The first object is usually the company website, not the LinkedIn URL.</p>
<h2 id="is-ninjapear-api-the-same-as-proxycurl-api">Is NinjaPear API the same as Proxycurl API?</h2>
<p>No.</p>
<p>Here is the comparison that matters.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Proxycurl</th>
<th>NinjaPear</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Canonical entity key</td>
<td>LinkedIn URL</td>
<td>Company website / public-web identity</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Person enrichment</td>
<td>LinkedIn-shaped profile object</td>
<td>Public-web employee profile object</td>
<td>Depends</td>
</tr>
<tr>
<td>Company enrichment</td>
<td>Company profile + employee count</td>
<td>Details + count + updates + funding</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Customer / partner / investor graph</td>
<td>Weak</td>
<td>Strong</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Competitor graph</td>
<td>Weak</td>
<td>Strong</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Monitoring</td>
<td>Repeated enrichment or indirect detection</td>
<td>Blog + website + X updates</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Direct LinkedIn mirroring</td>
<td>Yes</td>
<td>No</td>
<td>Proxycurl</td>
</tr>
<tr>
<td>Legal durability</td>
<td>Low</td>
<td>Higher</td>
<td>NinjaPear</td>
</tr>
</tbody>
</table>
<p>And here is the endpoint-level view.</p>
<table>
<thead>
<tr>
<th>Proxycurl API group</th>
<th>Representative endpoint(s)</th>
<th>Use case</th>
<th>Closest NinjaPear API</th>
<th>Technical change</th>
<th>Gain</th>
<th>Loss</th>
</tr>
</thead>
<tbody>
<tr>
<td>People API</td>
<td>Person Profile, Person Lookup, Role Lookup</td>
<td>Prospect enrichment</td>
<td>Employee API</td>
<td>Stop using LinkedIn URL as the primary object</td>
<td>Lower legal risk, broader public-web sourcing</td>
<td>Not a LinkedIn mirror</td>
</tr>
<tr>
<td>Company API</td>
<td>Company Profile, Company Lookup, Employee Count</td>
<td>Account enrichment</td>
<td>Company API</td>
<td>Website becomes the canonical key</td>
<td>Details, count, updates, funding</td>
<td>Different schema</td>
</tr>
<tr>
<td>Contact API</td>
<td>Work Email, Personal Email, Phone</td>
<td>Outbound prep</td>
<td>Work Email + Employee workflows</td>
<td>Less profile-centric</td>
<td>Cleaner public-web model</td>
<td>Not field-for-field</td>
</tr>
<tr>
<td>Employee Listing API</td>
<td>Employee Listing, Employee Search</td>
<td>Org mapping</td>
<td>Employee + Company workflows</td>
<td>Not a literal roster clone</td>
<td>Better fit for account research</td>
<td>No LinkedIn roster mirror</td>
</tr>
<tr>
<td>Search API</td>
<td>Person Search, Company Search</td>
<td>Prospecting</td>
<td>Customer API + Competitor API + Company API</td>
<td>Start from account relationships</td>
<td>Better signal for GTM</td>
<td>Less familiar to profile-first teams</td>
</tr>
<tr>
<td>Signals workflow</td>
<td>Repeated enrichments and compare</td>
<td>Timing signals</td>
<td>Monitor API</td>
<td>Use update feeds</td>
<td>Better company timing signal</td>
<td>Not pure job-change only</td>
</tr>
</tbody>
</table>
<p>The important part is this: NinjaPear solves many of the same business jobs, but it does not do so by pretending LinkedIn is the center of the universe.</p>
<h2 id="what-you-should-build-now">What you should build now</h2>
<h3 id="if-your-old-use-case-was-person-enrichment">If your old use case was person enrichment</h3>
<p>Use the Employee API when the real need is to identify a professional from public signals and return work history, education, location, bio, and social presence.</p>
<p>NinjaPear published launch match-rate data for this endpoint:</p>
<table>
<thead>
<tr>
<th>Input method</th>
<th>Profiles found</th>
<th>Accuracy</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Work email</td>
<td>10/10</td>
<td>⭐⭐⭐⭐⭐</td>
<td>Work email</td>
</tr>
<tr>
<td>Name + company</td>
<td>9/10</td>
<td>⭐⭐⭐⭐☆</td>
<td>Work email</td>
</tr>
<tr>
<td>Role + company</td>
<td>7/10</td>
<td>⭐⭐⭐☆☆</td>
<td>Work email</td>
</tr>
</tbody>
</table>
<p>If you have a work email, use it. That is the cleanest identity anchor.</p>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/employee/profile&quot; \
  --data-urlencode &quot;work_email=[email protected]&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<pre><code class="language-python">import ninjapear

configuration = ninjapear.Configuration(
    host=&quot;https://nubela.co&quot;,
    access_token=&quot;YOUR_API_KEY&quot;,
)

with ninjapear.ApiClient(configuration) as api_client:
    api = ninjapear.EmployeeAPIApi(api_client)
    response = api.get_person_profile(work_email=&quot;[email protected]&quot;)
    print(response)
</code></pre>
<pre><code class="language-javascript">const NinjaPear = require(&quot;ninjapear&quot;);
const defaultClient = NinjaPear.ApiClient.instance;
defaultClient.authentications[&quot;bearerAuth&quot;].accessToken = &quot;YOUR_API_KEY&quot;;

const api = new NinjaPear.EmployeeAPIApi();
api.getPersonProfile({ workEmail: &quot;[email protected]&quot; }).then((data) =&gt; {
  console.log(data);
});
</code></pre>
<h3 id="if-your-old-use-case-was-company-enrichment">If your old use case was company enrichment</h3>
<p>Use the Company API.</p>
<p>Current company endpoints on the site include:</p>
<ul>
<li><code>GET /api/v1/company/details</code></li>
<li><code>GET /api/v1/company/employee-count</code></li>
<li><code>GET /api/v1/company/updates</code></li>
<li><code>GET /api/v1/company/funding</code></li>
</ul>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/company/details&quot; \
  --data-urlencode &quot;website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<pre><code class="language-python">import ninjapear

configuration = ninjapear.Configuration(
    host=&quot;https://nubela.co&quot;,
    access_token=&quot;YOUR_API_KEY&quot;,
)

with ninjapear.ApiClient(configuration) as api_client:
    api = ninjapear.CompanyAPIApi(api_client)
    response = api.get_company_details(website=&quot;https://stripe.com&quot;)
    print(response)
</code></pre>
<pre><code class="language-javascript">const NinjaPear = require(&quot;ninjapear&quot;);
const defaultClient = NinjaPear.ApiClient.instance;
defaultClient.authentications[&quot;bearerAuth&quot;].accessToken = &quot;YOUR_API_KEY&quot;;

const api = new NinjaPear.CompanyAPIApi();
api.getCompanyDetails(&quot;https://stripe.com&quot;).then((data) =&gt; {
  console.log(data);
});
</code></pre>
<h3 id="if-your-old-use-case-was-employee-listing">If your old use case was employee listing</h3>
<p>Be honest about what you actually need.</p>
<p>If you need a pixel-perfect public LinkedIn roster, NinjaPear is not that.</p>
<p>If you need to identify relevant people at a company with lower legal risk, use:</p>
<ul>
<li>Employee API for person-level enrichment</li>
<li>Company API for company context</li>
<li>Customer and Competitor APIs if the real job is account selection, not staff enumeration</li>
</ul>
<p>This is where a lot of teams fool themselves. They ask for an employee list when what they really need is a way to find buying committees.</p>
<h3 id="if-your-old-use-case-was-buyer-discovery">If your old use case was buyer discovery</h3>
<p>Use relationship data instead of profile search as the center of your architecture.</p>
<p>With NinjaPear, you can start from:</p>
<ul>
<li>customer lists</li>
<li>investors</li>
<li>partners and platforms</li>
<li>competitors by SEO overlap</li>
<li>competitors by product category overlap</li>
</ul>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/customer/listing&quot; \
  --data-urlencode &quot;website=https://shopify.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<pre><code class="language-python">import ninjapear

configuration = ninjapear.Configuration(
    host=&quot;https://nubela.co&quot;,
    access_token=&quot;YOUR_API_KEY&quot;,
)

with ninjapear.ApiClient(configuration) as api_client:
    api = ninjapear.CustomerAPIApi(api_client)
    response = api.get_customer_listing(website=&quot;https://shopify.com&quot;)
    print(response)
</code></pre>
<pre><code class="language-javascript">const NinjaPear = require(&quot;ninjapear&quot;);
const defaultClient = NinjaPear.ApiClient.instance;
defaultClient.authentications[&quot;bearerAuth&quot;].accessToken = &quot;YOUR_API_KEY&quot;;

const api = new NinjaPear.CustomerAPIApi();
api.getCustomerListing(&quot;https://shopify.com&quot;).then((data) =&gt; {
  console.log(data);
});
</code></pre>
<p>This is a better GTM primitive most of the time. Customer graphs and competitor graphs tell you where to fish. A scraped profile usually just tells you who is in the water.</p>
<h3 id="if-your-old-use-case-was-timing-signals">If your old use case was timing signals</h3>
<p>Use Monitor API or Company Monitor.</p>
<p>NinjaPear’s public Company Monitor page shows three monitored source types:</p>
<ul>
<li>blog posts</li>
<li>website changes</li>
<li>X posts</li>
</ul>
<p><img alt="NinjaPear Company Monitor" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/1a996126e3f1-2.webp" /></p>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/company/updates&quot; \
  --data-urlencode &quot;website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<pre><code class="language-python">import ninjapear

configuration = ninjapear.Configuration(
    host=&quot;https://nubela.co&quot;,
    access_token=&quot;YOUR_API_KEY&quot;,
)

with ninjapear.ApiClient(configuration) as api_client:
    api = ninjapear.CompanyAPIApi(api_client)
    response = api.get_company_updates(website=&quot;https://stripe.com&quot;)
    print(response)
</code></pre>
<pre><code class="language-javascript">const NinjaPear = require(&quot;ninjapear&quot;);
const defaultClient = NinjaPear.ApiClient.instance;
defaultClient.authentications[&quot;bearerAuth&quot;].accessToken = &quot;YOUR_API_KEY&quot;;

const api = new NinjaPear.CompanyAPIApi();
api.getCompanyUpdates(&quot;https://stripe.com&quot;).then((data) =&gt; {
  console.log(data);
});
</code></pre>
<p>For sales teams and competitive-intel teams, that is often better than polling stale profile objects and pretending that is <code>intent data</code>.</p>
<h2 id="faq">FAQ</h2>
<h3 id="is-proxycurl-api-still-available">Is Proxycurl API still available?</h3>
<p>No.</p>
<h3 id="why-was-proxycurl-api-shut-down">Why was Proxycurl API shut down?</h3>
<p>Because LinkedIn sued Proxycurl in 2025. We settled, and I do not want customers carrying that legal risk forward.</p>
<h3 id="can-i-still-use-old-proxycurl-docs">Can I still use old Proxycurl docs?</h3>
<p>Only as historical reference.</p>
<h3 id="is-ninjapear-api-a-direct-replacement">Is NinjaPear API a direct replacement?</h3>
<p>No.</p>
<h3 id="does-ninjapear-scrape-linkedin">Does NinjaPear scrape LinkedIn?</h3>
<p>No. NinjaPear states that employee data is publicly sourced and that it does not scrape professional social media platforms.</p>
<h3 id="can-ninjapear-solve-the-same-use-cases">Can NinjaPear solve the same use cases?</h3>
<p>Often yes, but usually with different primitives: employee profiles from public sources, company details, customer graphs, competitor data, and update feeds.</p>
<h3 id="what-if-i-only-wanted-job-change-or-account-signals">What if I only wanted job-change or account signals?</h3>
<p>Use Monitor API or Company Monitor.</p>
<p>If you are searching for <strong>proxycurl api</strong> in 2026, the answer is simple. Proxycurl is shut down. If your real need today is company intelligence, employee enrichment from public sources, customer relationships, competitor mapping, or account monitoring, build on NinjaPear. I built Proxycurl, I shut it down, and NinjaPear is the system I built after learning exactly where Proxycurl broke.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ 25 Best Data Enrichment API in 2026 (Ranked) ]]></title>
        <description><![CDATA[ If you searched for data enrichment api, you probably want a ranked answer, not a definition. You want to know which API is worth wiring into your system, what it costs, where the data goes stale, and which products create extra implementation work later. My answer is NinjaPear. Not because ]]></description>
        <link>https://nubela.co/blog/best-data-enrichment-api/</link>
        <guid isPermaLink="false">69f06b78f33a4e00011b155a</guid>
        <category><![CDATA[ data enrichment api ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Tue, 28 Apr 2026 16:10:32 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_15-2.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you searched for <code>data enrichment api</code>, you probably want a ranked answer, not a definition. You want to know which API is worth wiring into your system, what it costs, where the data goes stale, and which products create extra implementation work later. My answer is <strong><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></strong>. Not because it wins every subcategory, but because it combines company data, employee data, relationship data, change monitoring, and unusually strong AI-agent readiness in one product.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/CRM</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/m4rkuskk</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">The API itself matters less than how often the data drifts and how ugly the field mapping gets once you start pushing it into a real CRM.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/CRM/comments/1si1jbw/crm_enrichment_apis/?ref=nubela.co" rel="nofollow" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the real buying problem: drift and workflow fit.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Data Enrichment API Cost + Refresh Calculator + AI Readiness Checklist</strong><br>
<span style="color:#555;">A working spreadsheet with pricing notes, refresh math, monthly volume planning, and an AI-docs checklist for 25 vendors.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/data-enrichment-api-cost-refresh-calculator-52b7c638.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="quick-rankings">Quick rankings</h2>
<p>Here is the ranked list first.</p>
<ol>
<li><strong>NinjaPear</strong></li>
<li><strong>EnrichmentAPI</strong></li>
<li><strong>People Data Labs</strong></li>
<li><strong>Apollo</strong></li>
<li><strong>Clearbit</strong></li>
<li><strong>ZoomInfo</strong></li>
<li><strong>FullContact</strong></li>
<li><strong>Hunter</strong></li>
<li><strong>Clay</strong></li>
<li><strong>Crunchbase</strong></li>
<li><strong>Cognism</strong></li>
<li><strong>RocketReach</strong></li>
<li><strong>UpLead</strong></li>
<li><strong>Dropcontact</strong></li>
<li><strong>Clearout</strong></li>
<li><strong>Snov.io</strong></li>
<li><strong>Lusha</strong></li>
<li><strong>ContactOut</strong></li>
<li><strong>LeadMagic</strong></li>
<li><strong>Kaspr</strong></li>
<li><strong>Prospeo</strong></li>
<li><strong>Adapt.io</strong></li>
<li><strong>Seamless.AI</strong></li>
<li><strong>Datagma</strong></li>
<li><strong>Coresignal</strong></li>
</ol>
<p>This lines up with how many buyers already scan the market.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/CRM</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/m4rkuskk</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">the more ‘established’ ones I’ve seen used a lot: Clearbit, Apollo, ZoomInfo, Crunchbase, People Data Labs</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/CRM/comments/1si1jbw/crm_enrichment_apis/?ref=nubela.co" rel="nofollow" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That shortlist is reasonable. It is also incomplete.</p>
<p>The real split in 2026 is this:</p>
<ul>
<li>dataset vendors</li>
<li>live enrichment vendors</li>
<li>prospecting tools with an API attached</li>
<li>intelligence products that also track what changed</li>
</ul>
<p>Those are not the same thing. Buyers still compare them like they are.</p>
<h2 id="how-i-ranked-them">How I ranked them</h2>
<p>I used seven dimensions:</p>
<ol>
<li><strong>Freshness</strong></li>
<li><strong>Richness</strong></li>
<li><strong>Scalability</strong></li>
<li><strong>Pricing clarity</strong></li>
<li><strong>Developer friendliness</strong></li>
<li><strong>Stability</strong></li>
<li><strong>AI readiness</strong></li>
</ol>
<p>Freshness is obvious. Old data degrades quickly.</p>
<p>Richness is not about who has the longest field list. It is whether the returned fields help you do real work.</p>
<p>Scalability is whether I would trust the product inside a system, not whether the vendor sells to large companies.</p>
<p>Pricing clarity matters because hidden pricing usually means forecasting pain, longer sales cycles, or both.</p>
<p>Developer friendliness is docs, schemas, errors, auth flow, rate limits, timeout behavior, and how messy the async model gets.</p>
<p>Stability is whether the product feels like dependable infrastructure.</p>
<p>AI readiness is now part of API quality. If your docs are hard for Claude, Cursor, Codex, or ChatGPT to ingest, integration gets slower.</p>
<h2 id="pricing-table">Pricing table</h2>
<p>Pricing belongs near the top because this is where vendors either respect your time or don’t.</p>
<p>If a company hides pricing, I count that against them. Not because every custom contract is bad. Because in a category this mature, hiding entry-level economics is usually a sign that evaluation will be slower and harder than it needs to be.</p>
<table>
<thead>
<tr>
<th>Vendor</th>
<th style="text-align: right;">Public starting price</th>
<th>API access</th>
<th>Pricing style</th>
<th>Opaque?</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear</td>
<td style="text-align: right;">Trial + $49/mo tier or PAYG</td>
<td>Yes</td>
<td>Credit-based</td>
<td>No</td>
<td>3-day trial, 10 credits, PAYG valid 18 months, subscriptions require 12-month commitment</td>
</tr>
<tr>
<td>EnrichmentAPI</td>
<td style="text-align: right;">$99</td>
<td>Yes</td>
<td>Credit-based</td>
<td>No</td>
<td>Person API 5 credits, Company API 5, Employees API 10, retries up to 60s</td>
</tr>
<tr>
<td>People Data Labs</td>
<td style="text-align: right;">~$98/mo person, ~$100/mo company</td>
<td>Yes</td>
<td>Credit-based</td>
<td>No</td>
<td>Transparent credit logic, but freshness is more dataset-style than live-style</td>
</tr>
<tr>
<td>Apollo</td>
<td style="text-align: right;">$49/seat/mo basic, API on custom</td>
<td>Partial</td>
<td>Seat + custom API</td>
<td>Partial</td>
<td>Seat pricing public, real API usage gets sales-led fast</td>
</tr>
<tr>
<td>Clearbit</td>
<td style="text-align: right;">Custom / opaque</td>
<td>Yes</td>
<td>Custom</td>
<td>Yes</td>
<td>No clean self-serve API pricing</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td style="text-align: right;">Custom / opaque</td>
<td>Yes</td>
<td>Custom</td>
<td>Yes</td>
<td>Enterprise sales motion, no public API pricing</td>
</tr>
<tr>
<td>FullContact</td>
<td style="text-align: right;">Custom / opaque</td>
<td>Yes</td>
<td>Custom</td>
<td>Yes</td>
<td>Different category, same opaque buying motion</td>
</tr>
<tr>
<td>Hunter</td>
<td style="text-align: right;">$49/mo monthly, $34/mo annual starter</td>
<td>Yes</td>
<td>Credit-based</td>
<td>No</td>
<td>Clear pricing, clear email economics</td>
</tr>
<tr>
<td>Clay</td>
<td style="text-align: right;">Custom usage varies</td>
<td>Partial</td>
<td>Credits + provider costs</td>
<td>Partial</td>
<td>Entry pricing exists, real cost depends on stack</td>
</tr>
<tr>
<td>Crunchbase</td>
<td style="text-align: right;">Mixed / limited visibility</td>
<td>Yes</td>
<td>Plan + API access</td>
<td>Partial</td>
<td>Useful company data, API economics not clean publicly</td>
</tr>
<tr>
<td>Cognism</td>
<td style="text-align: right;">From ~$12,000/yr in public CRM enrichment content</td>
<td>Yes</td>
<td>Contract + credits</td>
<td>Partial</td>
<td>Contract-first</td>
</tr>
<tr>
<td>RocketReach</td>
<td style="text-align: right;">Plans start ~$6k annually for higher API limits</td>
<td>Yes</td>
<td>Mixed</td>
<td>Partial</td>
<td>Public plans exist, API cost less obvious</td>
</tr>
<tr>
<td>UpLead</td>
<td style="text-align: right;">Public plans, API included by plan</td>
<td>Yes</td>
<td>Seat + credits</td>
<td>Partial</td>
<td>More visible than enterprise vendors, still fuzzy</td>
</tr>
<tr>
<td>Dropcontact</td>
<td style="text-align: right;">~€24/mo</td>
<td>Yes</td>
<td>Pay on success</td>
<td>No</td>
<td>You pay when it finds or verifies an email</td>
</tr>
<tr>
<td>Clearout</td>
<td style="text-align: right;">$19.5/mo monthly, $16/mo annual starter</td>
<td>Yes</td>
<td>PAYG + subscription</td>
<td>No</td>
<td>Unused credits roll over and do not expire</td>
</tr>
<tr>
<td>Snov.io</td>
<td style="text-align: right;">~$39/mo</td>
<td>Partial</td>
<td>Seat + credits</td>
<td>No</td>
<td>Cheap to try, not infra-grade</td>
</tr>
<tr>
<td>Lusha</td>
<td style="text-align: right;">Public plans, API less central</td>
<td>Partial</td>
<td>Seat + credits</td>
<td>Partial</td>
<td>More SDR tool than API product</td>
</tr>
<tr>
<td>ContactOut</td>
<td style="text-align: right;">$99/mo email, $199/mo email + phone</td>
<td>Yes</td>
<td>Plan-based</td>
<td>No</td>
<td>People-first</td>
</tr>
<tr>
<td>LeadMagic</td>
<td style="text-align: right;">$49/mo</td>
<td>Yes</td>
<td>Pay per result</td>
<td>No</td>
<td>Good for waterfall buyers</td>
</tr>
<tr>
<td>Kaspr</td>
<td style="text-align: right;">€45/mo</td>
<td>Starter+</td>
<td>Seat + credits</td>
<td>No</td>
<td>API starts from Starter</td>
</tr>
<tr>
<td>Prospeo</td>
<td style="text-align: right;">Public credit pricing</td>
<td>Yes</td>
<td>Credits</td>
<td>No</td>
<td>Small-team-friendly</td>
</tr>
<tr>
<td>Adapt.io</td>
<td style="text-align: right;">Free, $49, $99 public tiers</td>
<td>Yes</td>
<td>Seat + credits</td>
<td>No</td>
<td>Public enough, just not very active-feeling</td>
</tr>
<tr>
<td>Seamless.AI</td>
<td style="text-align: right;">Free trial, serious pricing sales-led</td>
<td>Yes</td>
<td>Trial + contract</td>
<td>Partial</td>
<td>High awareness, pricing gets vague</td>
</tr>
<tr>
<td>Datagma</td>
<td style="text-align: right;">$39/mo billed yearly</td>
<td>Yes</td>
<td>Credits</td>
<td>No</td>
<td>Lower-cost API-first option</td>
</tr>
<tr>
<td>Coresignal</td>
<td style="text-align: right;">$49/mo API starting point</td>
<td>Yes</td>
<td>API + datasets</td>
<td>No</td>
<td>Broader dataset cost varies</td>
</tr>
</tbody>
</table>
<p>A few takeaways:</p>
<ul>
<li><strong>NinjaPear</strong>, <strong>EnrichmentAPI</strong>, <strong>Hunter</strong>, <strong>Clearout</strong>, <strong>LeadMagic</strong>, <strong>Prospeo</strong>, and <strong>Datagma</strong> let you estimate cost without a sales call.</li>
<li><strong>Clearbit</strong>, <strong>ZoomInfo</strong>, and <strong>FullContact</strong> lose points because hidden pricing slows evaluation.</li>
<li><strong>Apollo</strong>, <strong>Clay</strong>, <strong>Cognism</strong>, and <strong>RocketReach</strong> sit in the middle: enough public info to get interested, not enough to forecast neatly.</li>
</ul>
<h2 id="1-ninjapear">1. NinjaPear</h2>
<p><strong>What it does</strong></p>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> ranks first because it does more than one-time append. Company details. Employee profiles. Customer relationships. Competitors. Monitoring. That last part matters because after enrichment, the next operational question is usually what changed.</p>
<p><strong>How I scored it</strong></p>
<p>I scored freshness <strong>5/5</strong> because the public product and docs are built around current company intelligence plus ongoing updates, not just static appends. I scored richness <strong>4/5</strong> because it covers company, employee, relationship, and monitoring data, but it is not pretending to be a universal contact database. Dev-friendliness is <strong>5/5</strong> because the docs expose Markdown docs, <code>llms.txt</code>, OpenAPI, SDKs, rate-limit guidance, timeout guidance, and explicit error codes. AI readiness is <strong>5/5</strong> because it is the only vendor here with clear public evidence across all five AI criteria.</p>
<p><strong>Pricing</strong></p>
<p>3-day free trial with <strong>10 credits</strong>. Public tiers at <strong>$49</strong>, <strong>$299</strong>, <strong>$899</strong>, and <strong>$1,899</strong> per month. PAYG credits last <strong>18 months</strong>. Subscriptions come with a <strong>12-month commitment</strong>. Customer Listing is <strong>1 credit per request + 2 credits per customer returned</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>Yes</strong></li>
<li>MCP or agent path: <strong>Yes</strong></li>
<li>Markdown docs: <strong>Yes</strong></li>
<li><code>llms.txt</code>: <strong>Yes</strong></li>
<li>OpenAPI spec: <strong>Yes</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>It feels built for builders. Relationship data plus monitoring is a real differentiator. Most vendors stop at returning a record. NinjaPear gets closer to answering why the account matters now.</p>
<p><strong>What will annoy you</strong></p>
<p>If all you need is basic email append, this is more product than you need. Also, the subscription commitment is explicit and real.</p>
<p><strong>Best for</strong></p>
<p>Teams that care about company intelligence, timing, and AI-assisted implementation.</p>
<p><strong>User signal</strong></p>
<p>Public market discussion around GTM tools keeps drifting toward workflow fit, not just data size. That matches why NinjaPear ranks first here: it behaves more like a system input than a list vendor.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐⭐⭐ (5/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐⭐⭐ (5/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐⭐⭐⭐⭐ (5/5)</p>
<h2 id="2-enrichmentapi">2. EnrichmentAPI</h2>
<p><strong>What it does</strong></p>
<p>EnrichmentAPI is a generic enrichment API for person, company, employees, tech stack, and reverse email lookups.</p>
<p><strong>How I scored it</strong></p>
<p>I scored freshness <strong>4/5</strong> because the vendor positions the product as live enrichment and the docs discuss request retries and timeout behavior, which is at least evidence of request-time processing rather than only serving warehouse snapshots. I scored dev-friendliness <strong>4/5</strong> because the docs expose credit costs and ugly operational details. I held stability to <strong>3/5</strong> because docs explicitly mention <strong>408s on ~1-2% of requests</strong>, which is honest but still an integration burden. AI readiness is <strong>1/5</strong> because I found no public evidence of agent-specific documentation assets.</p>
<p><strong>Pricing</strong></p>
<p>Starts at <strong>$99</strong>. Person API <strong>5 credits</strong>, Company API <strong>5</strong>, Employees API <strong>10</strong>, Company Investment <strong>1</strong>, Tech Stack <strong>1</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>The docs disclose operational tradeoffs more clearly than most vendors do.</p>
<p><strong>What will annoy you</strong></p>
<p>Docs say requests may retry for up to <strong>60 seconds</strong>, and <strong>408s happen on roughly 1-2% of requests</strong>. So you need to engineer for that.</p>
<p><strong>Best for</strong></p>
<p>People who want a generic enrichment API with visible pricing and visible docs.</p>
<p><strong>User signal</strong></p>
<p>The strongest thing I can say here is that EnrichmentAPI is candid in docs where many competitors are vague. That matters. It reduces surprises.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐⭐☆ (4/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="3-people-data-labs">3. People Data Labs</h2>
<p><strong>What it does</strong></p>
<p>People Data Labs is builder infrastructure. Breadth. Scale. APIs designed for teams that will actually integrate and reprocess data.</p>
<p><strong>How I scored it</strong></p>
<p>I scored scalability <strong>5/5</strong> because the pricing docs, bulk API logic, and product structure clearly support larger-volume workflows. I scored freshness <strong>3/5</strong> because the company side still feels dataset-first, and PDL’s own ecosystem includes scheduled refresh cadences rather than a stronger live-change story. Dev-friendliness is <strong>5/5</strong> because the pricing docs are unusually explicit, credits are easy to model, and the API product feels like infra. AI readiness is <strong>2/5</strong> because the docs are strong for humans, but I found no public <code>llms.txt</code>, agent skill, or equivalent machine-first AI layer.</p>
<p><strong>Pricing</strong></p>
<p>Public pricing shows <strong>person enrichment from $98/mo for 350 credits</strong> and <strong>company enrichment from $100/mo for 1,000 credits</strong>. Docs explain credit logic clearly: successful matches generally consume <strong>1 credit</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Good API posture. Good pricing clarity. Serious infrastructure feel.</p>
<p><strong>What will annoy you</strong></p>
<p>Freshness tradeoff. This feels more like a dataset company with APIs than a live-change product.</p>
<p>You should also be honest about sourcing risk. PDL has long been associated with LinkedIn data in the market conversation. If your legal team cares, read this: <a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">Is scraping LinkedIn legal in 2026?</a></p>
<p><strong>Best for</strong></p>
<p>Builders who want scale and broad coverage more than live-change intelligence.</p>
<p><strong>User signal</strong></p>
<p>The market keeps using PDL as the serious builder benchmark. That reputation is deserved on infra and API design. It is less strong on freshness.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐⭐ (5/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐⭐⭐⭐ (5/5) | Stability ⭐⭐⭐⭐⭐ (5/5) | AI ⭐⭐☆☆☆ (2/5)</p>
<h2 id="4-apollo">4. Apollo</h2>
<p><strong>What it does</strong></p>
<p>Apollo is the default all-in-one outbound tool. Prospecting database, sequences, enrichment, the whole thing.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>4/5</strong> because Apollo covers person, company, and contact data well enough for a broad outbound workflow. I scored dev-friendliness <strong>2/5</strong> because the API starts clean but gets more complex once you use waterfall enrichment. Public docs explicitly state that when waterfall parameters are used, Apollo returns synchronous demographic and firmographic data first, then delivers email and phone enrichment <strong>asynchronously to a configured webhook</strong>. That is real complexity. Pricing is <strong>3/5</strong> because seats are public but serious API usage moves into custom territory.</p>
<p><strong>Pricing</strong></p>
<p>Basic <strong>$49</strong>, Professional <strong>$79</strong>, Organization <strong>$119</strong> per seat monthly, billed annually. API for advanced use cases is on <strong>Custom plans</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>It works well enough to stay on a lot of shortlists.</p>
<p><strong>What will annoy you</strong></p>
<p>API ergonomics get more complex when you move past the happy path. Waterfall email and phone enrichment can come back asynchronously via webhook, and Apollo may retry webhook calls, so your endpoint needs idempotency.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Competitive-Pie6298</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">apollo enrichment is a headache man especially with small lists i just skip it now ... so the list is usable without babysitting the workflow</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1ngpo00/apolloio_waterfall_email_enrichment/ned1cfk/?ref=nubela.co" rel="nofollow" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is a fair description of Apollo.</p>
<p><strong>Best for</strong></p>
<p>Teams that want convenience first.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐☆☆☆ (2/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="5-clearbit">5. Clearbit</h2>
<p><strong>What it does</strong></p>
<p>Clearbit is still relevant for company enrichment and routing workflows, especially in HubSpot-heavy stacks.</p>
<p><strong>How I scored it</strong></p>
<p>I scored freshness <strong>4/5</strong> because Clearbit still has a strong reputation in routing and form enrichment workflows where fast company resolution matters. I scored pricing <strong>2/5</strong> because public API economics are no longer easy to evaluate. I scored stability <strong>5/5</strong> because despite the buying-motion frustration, the product has years of operational credibility in this category.</p>
<p><strong>Pricing</strong></p>
<p>Opaque.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Good operating history in company enrichment and routing.</p>
<p><strong>What will annoy you</strong></p>
<p>The buying motion. Hidden pricing. Less self-serve. More platform gravity.</p>
<p><strong>Best for</strong></p>
<p>HubSpot-heavy teams doing routing and standard firmographics.</p>
<p><strong>User signal</strong></p>
<p>Clearbit still shows up constantly in buyer shortlists. The issue is not relevance. It is evaluation friction.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐⭐☆ (4/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐☆☆☆ (2/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐⭐⭐ (5/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="6-zoominfo">6. ZoomInfo</h2>
<p><strong>What it does</strong></p>
<p>ZoomInfo is the big enterprise incumbent. Huge dataset. Strong contact story. Enterprise buying motion.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness and scalability <strong>5/5</strong> because ZoomInfo’s entire value proposition is breadth and enterprise coverage. I scored pricing <strong>1/5</strong> because the API economics are opaque. I scored dev-friendliness <strong>2/5</strong> because enterprise vendors can have capable APIs, but public evaluation is weak and self-serve technical due diligence is harder than it should be. AI readiness stays <strong>1/5</strong> because I found no clear public evidence of an agent-native docs layer.</p>
<p><strong>Pricing</strong></p>
<p>Opaque.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Coverage, especially for enterprise US sales teams.</p>
<p><strong>What will annoy you</strong></p>
<p>Price opacity. Procurement drag. Contract gravity.</p>
<p><strong>Best for</strong></p>
<p>Large companies that want the incumbent and can pay for it.</p>
<p><strong>User signal</strong></p>
<p>ZoomInfo is still the enterprise default in many orgs. That says a lot about market reach. It says less about ease of evaluation.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐⭐⭐ (5/5) | Scalability ⭐⭐⭐⭐⭐ (5/5) | Pricing ⭐☆☆☆☆ (1/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐⭐⭐ (5/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="7-fullcontact">7. FullContact</h2>
<p><strong>What it does</strong></p>
<p>FullContact is better thought of as identity resolution infrastructure than a straight SDR enrichment tool.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>4/5</strong> because identity stitching can be very valuable in the right stack. I scored pricing <strong>2/5</strong> because public evaluation is still weak. Dev-friendliness is <strong>4/5</strong> because the product is more infrastructure-oriented than many sales-database vendors. AI readiness is <strong>2/5</strong> because while the product category maps well to programmatic use, I found no public evidence of dedicated AI-doc assets.</p>
<p><strong>Pricing</strong></p>
<p>Mostly custom.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>It solves a real identity problem that most prospecting tools don’t.</p>
<p><strong>What will annoy you</strong></p>
<p>If you want a simple contact-data vendor, this is not the cleanest buy.</p>
<p><strong>Best for</strong></p>
<p>Identity stitching and multi-identifier systems.</p>
<p><strong>User signal</strong></p>
<p>FullContact makes more sense to data teams than SDR teams. That is why it ranks mid-pack instead of near the top.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐☆☆☆ (2/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐⭐☆☆☆ (2/5)</p>
<h2 id="8-hunter">8. Hunter</h2>
<p><strong>What it does</strong></p>
<p>Hunter is email-first. Finder. Verifier. Domain search. Some enrichment.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing and dev-friendliness <strong>4/5</strong> because the public pricing and API credit model are clean. Hunter’s own help docs spell out API credit costs, including <strong>0.5 credit</strong> for Email Verifier in one help center article. I scored richness <strong>2/5</strong> because Hunter is narrower than company-intelligence vendors. Stability is <strong>5/5</strong> because it has stayed focused on the problem it actually solves.</p>
<p><strong>Pricing</strong></p>
<p>Starter <strong>$49 monthly</strong> or <strong>$34 annual equivalent</strong>, Growth <strong>$149</strong> or <strong>$104</strong>, Scale <strong>$299</strong> or <strong>$209</strong>. Search and verification credits are clearly described publicly.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>It knows what it is.</p>
<p><strong>What will annoy you</strong></p>
<p>It is not broad company intelligence.</p>
<p><strong>Best for</strong></p>
<p>Email-heavy workflows.</p>
<p><strong>User signal</strong></p>
<p>Hunter keeps winning because teams understand what they are buying. That is underrated.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐⭐⭐ (5/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="9-clay">9. Clay</h2>
<p><strong>What it does</strong></p>
<p>Clay is orchestration. It is not one enrichment API. It is a way to glue several together.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness and dev-friendliness <strong>4/5</strong> because Clay gives technical teams a lot of workflow flexibility. I scored pricing <strong>2/5</strong> because the true cost depends on both Clay and the providers you connect. That is the core tradeoff. AI readiness is <strong>2/5</strong> because Clay is conceptually very useful in AI-assisted workflows, but I did not find the same kind of public machine-readable AI-doc surface as NinjaPear.</p>
<p><strong>Pricing</strong></p>
<p>Depends on workflow credits and provider spend.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Very flexible. Good for waterfalls, branching, and ops workflows.</p>
<p><strong>What will annoy you</strong></p>
<p>Budget leakage if you do not watch it carefully.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/gtmengineering</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/basil2style</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I recommend you seriously consider replacing ZoomInfo with Clay ... but only after a pilot run, to validate Clay’s coverage and accuracy.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/gtmengineering/comments/1pd3odj/can_clay_be_my_main_enrichment_tool_instead_of/ns2nrmc/?ref=nubela.co" rel="nofollow" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the right mentality with Clay. Pilot first. Model cost carefully.</p>
<p><strong>Best for</strong></p>
<p>GTM engineers who need orchestration.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐⭐☆ (4/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐☆☆☆ (2/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐⭐☆☆☆ (2/5)</p>
<h2 id="10-crunchbase">10. Crunchbase</h2>
<p><strong>What it does</strong></p>
<p>Crunchbase is company and funding data. Useful, but not broad contact enrichment.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>3/5</strong> because the company and funding layer is useful, but narrower than broader intelligence products. I scored dev-friendliness <strong>4/5</strong> because the API story is real and the company-data use cases are clear. AI readiness stays <strong>1/5</strong> because I found no clear public AI-doc evidence.</p>
<p><strong>Pricing</strong></p>
<p>Mixed.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Funding and company metadata remain useful for segmentation and market mapping.</p>
<p><strong>What will annoy you</strong></p>
<p>Weak person and contact story.</p>
<p><strong>Best for</strong></p>
<p>Company-level enrichment and funding-aware workflows.</p>
<p><strong>User signal</strong></p>
<p>Crunchbase still matters when the company object matters more than the contact object.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐⭐⭐ (5/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="11-cognism">11. Cognism</h2>
<p><strong>What it does</strong></p>
<p>Cognism is premium B2B sales data, especially where phone data matters.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>4/5</strong> because the phone and contact angle is a real strength. Pricing is <strong>2/5</strong> because even though public CRM enrichment content references pricing from <strong>~$12,000 annually</strong>, the actual motion is still contract-led. Dev-friendliness is <strong>2/5</strong> because it does not feel like a builder-first product in public.</p>
<p><strong>Pricing</strong></p>
<p>Public CRM enrichment content says pricing starts around <strong>$12,000 annually including 25,000 credits</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Phone coverage is stronger than a lot of mid-market vendors.</p>
<p><strong>What will annoy you</strong></p>
<p>Not a builder-first feel.</p>
<p><strong>Best for</strong></p>
<p>Teams where phone coverage matters a lot.</p>
<p><strong>User signal</strong></p>
<p>Cognism usually enters the conversation when teams care about higher-end sales data rather than cheap API experimentation.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐⭐☆ (4/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐☆☆☆ (2/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="12-rocketreach">12. RocketReach</h2>
<p><strong>What it does</strong></p>
<p>RocketReach is contact-finding API territory. Email. Phone. Straight-line use cases.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>3/5</strong> because the contact layer is useful but not especially broad. I scored pricing <strong>3/5</strong> because the public site exposes plans and mentions API limits, but the real API economics still drift into contract language. Stability is <strong>4/5</strong> because it is a familiar product with a long operating history.</p>
<p><strong>Pricing</strong></p>
<p>Public pricing shows plans with higher API limits starting around <strong>$6k annually</strong>, but API-only economics are still not especially crisp.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Familiar and usually serviceable.</p>
<p><strong>What will annoy you</strong></p>
<p>It rarely wins on workflow depth or pricing clarity.</p>
<p><strong>Best for</strong></p>
<p>Basic contact enrichment.</p>
<p><strong>User signal</strong></p>
<p>RocketReach is often the answer when teams want something known and adequate, not especially opinionated.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="13-uplead">13. UpLead</h2>
<p><strong>What it does</strong></p>
<p>UpLead gives you verified contacts and company data in a cleaner mid-market package.</p>
<p><strong>How I scored it</strong></p>
<p>I scored most dimensions at <strong>3/5</strong> because UpLead is competent across the board without being especially differentiated. Stability gets <strong>4/5</strong> because it remains a credible mid-market option. AI readiness stays <strong>1/5</strong> because I found no clear public evidence beyond standard docs.</p>
<p><strong>Pricing</strong></p>
<p>Public plans exist and the site says API access is included by plan. Real economics still depend on plan level.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Less enterprise theater than ZoomInfo.</p>
<p><strong>What will annoy you</strong></p>
<p>Still feels more sales tool than developer platform.</p>
<p><strong>Best for</strong></p>
<p>Mid-market teams that want verified contacts without ZoomInfo pricing gravity.</p>
<p><strong>User signal</strong></p>
<p>UpLead tends to come up when buyers want something cleaner than the enterprise incumbents and less ops-heavy than Clay.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="14-dropcontact">14. Dropcontact</h2>
<p><strong>What it does</strong></p>
<p>Dropcontact is email enrichment with pay-for-success pricing and privacy positioning.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing <strong>4/5</strong> because the public pay-on-success model is straightforward and rational. I scored richness <strong>2/5</strong> because this is a narrower email enrichment product, not a broader account-intelligence layer. Stability is <strong>4/5</strong> because the product knows its lane.</p>
<p><strong>Pricing</strong></p>
<p>You pay when an email is found or verified.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Paying for success is rational.</p>
<p><strong>What will annoy you</strong></p>
<p>Scope is narrow.</p>
<p><strong>Best for</strong></p>
<p>Privacy-conscious email enrichment.</p>
<p><strong>User signal</strong></p>
<p>Dropcontact is appealing when buyers are tired of paying for misses.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="15-clearout">15. Clearout</h2>
<p><strong>What it does</strong></p>
<p>Clearout is email finder, verifier, and narrow enrichment.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing <strong>4/5</strong> because public pricing is easy to find and the rollover policy is unusually buyer-friendly. I scored richness <strong>2/5</strong> because it is still a narrow product relative to broader enrichment APIs. Stability is <strong>4/5</strong> because the economics are transparent and the scope is clear.</p>
<p><strong>Pricing</strong></p>
<p>Starter <strong>3,000 credits at $16/mo annual or $19.5 monthly</strong>. Pro <strong>10K credits at $32/mo annual or $40 monthly</strong>. Credits roll over.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Clear economics.</p>
<p><strong>What will annoy you</strong></p>
<p>Narrower scope than people think.</p>
<p><strong>Best for</strong></p>
<p>Verifier-heavy email workflows.</p>
<p><strong>User signal</strong></p>
<p>Clearout is one of the easier products here to reason about financially. That matters more than people admit.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="16-snovio">16. Snov.io</h2>
<p><strong>What it does</strong></p>
<p>Budget outbound platform with enrichment features.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing <strong>4/5</strong> because public entry pricing is easy to find and low enough for small teams to test. I scored dev-friendliness <strong>2/5</strong> because while API access exists, the product still feels like an outbound suite first and infra second. AI readiness stays <strong>1/5</strong> because I found no public evidence of agent-specific docs.</p>
<p><strong>Pricing</strong></p>
<p>Around <strong>$39/mo</strong> publicly.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Cheap to try.</p>
<p><strong>What will annoy you</strong></p>
<p>Not serious data infrastructure.</p>
<p><strong>Best for</strong></p>
<p>Small outbound teams with small budgets.</p>
<p><strong>User signal</strong></p>
<p>Snov.io tends to win small-budget experiments, not serious platform decisions.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐☆☆☆ (2/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="17-lusha">17. Lusha</h2>
<p><strong>What it does</strong></p>
<p>Lusha is contact data for SDR teams.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>3/5</strong> because the contact layer is useful for rep workflows. I scored pricing and dev-friendliness <strong>2/5</strong> because the API is not the center of gravity and the product story is more sales-tool than developer platform.</p>
<p><strong>Pricing</strong></p>
<p>Public plans exist. API is not the center of gravity.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Simple SDR product story.</p>
<p><strong>What will annoy you</strong></p>
<p>Not very interesting for flexible product workflows.</p>
<p><strong>Best for</strong></p>
<p>SDR teams that want speed over elegance.</p>
<p><strong>User signal</strong></p>
<p>Lusha is easy to explain internally. That is a real buying advantage, even if it is not the most flexible API product.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐☆☆☆ (2/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐☆☆☆ (2/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="18-contactout">18. ContactOut</h2>
<p><strong>What it does</strong></p>
<p>ContactOut is people-first enrichment with recruiter DNA.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>2/5</strong> because the company story is weak, but the people and contact use case is clear. Pricing and dev-friendliness sit at <strong>3/5</strong> because public pricing exists and API access exists, but the platform is still more recruiter/contact oriented than broad enrichment infra.</p>
<p><strong>Pricing</strong></p>
<p><strong>$99/mo</strong> for email. <strong>$199/mo</strong> for email + phone.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Useful if your problem is people and contact info.</p>
<p><strong>What will annoy you</strong></p>
<p>Weak company story.</p>
<p><strong>Best for</strong></p>
<p>Recruiting and sourcing.</p>
<p><strong>User signal</strong></p>
<p>ContactOut makes more sense when the person object matters more than the account object.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="19-leadmagic">19. LeadMagic</h2>
<p><strong>What it does</strong></p>
<p>LeadMagic is API-first enough to be interesting if you think in waterfalls.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing and dev-friendliness <strong>4/5</strong> because the pay-per-result framing and API orientation make it easier to reason about than many sales-led tools. I scored AI readiness <strong>2/5</strong> because there is at least some public AI-agent positioning, but not the stronger machine-readable evidence I looked for elsewhere. Stability is <strong>3/5</strong> because the brand is still less proven than larger incumbents.</p>
<p><strong>Pricing</strong></p>
<p>Starts at <strong>$49/mo</strong> with pay-per-result positioning.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>Some public AI-agent positioning</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Interesting alternative to bigger incumbents if you care about waterfall economics.</p>
<p><strong>What will annoy you</strong></p>
<p>Brand trust is lower.</p>
<p><strong>Best for</strong></p>
<p>Waterfall-heavy GTM engineering.</p>
<p><strong>User signal</strong></p>
<p>LeadMagic is the sort of vendor technical buyers try when they are tired of paying for broad seats they do not need.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐⭐☆☆☆ (2/5)</p>
<h2 id="20-kaspr">20. Kaspr</h2>
<p><strong>What it does</strong></p>
<p>Kaspr is LinkedIn-URL-driven contact enrichment.</p>
<p><strong>How I scored it</strong></p>
<p>I scored richness <strong>2/5</strong> because it is useful but narrow. Pricing and scalability are <strong>3/5</strong> because public plans exist and API access starts at Starter, but it is still not the primary product story. Dev-friendliness is <strong>2/5</strong> because the API feels secondary.</p>
<p><strong>Pricing</strong></p>
<p>Starts at <strong>€45/mo</strong>. API from <strong>Starter</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Simple fit if LinkedIn URL is your starting key.</p>
<p><strong>What will annoy you</strong></p>
<p>Credit logic can get annoying. Export credits apply too.</p>
<p><strong>Best for</strong></p>
<p>Known-profile enrichment.</p>
<p><strong>User signal</strong></p>
<p>Kaspr is practical when your workflow already starts from known profiles, less compelling as a general data layer.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐☆☆☆ (2/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="21-prospeo">21. Prospeo</h2>
<p><strong>What it does</strong></p>
<p>Prospeo is a lean, cheaper enrichment option for emails, phones, and simple lookups.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing <strong>4/5</strong> because the public credit model is simple. Richness is <strong>2/5</strong> because breadth is limited. Dev-friendliness and stability sit at <strong>3/5</strong> because the product is transparent but clearly aimed at smaller workflows.</p>
<p><strong>Pricing</strong></p>
<p>Public API pricing says <strong>1 credit per enrichment request</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Transparent. Cheap enough.</p>
<p><strong>What will annoy you</strong></p>
<p>Limited breadth.</p>
<p><strong>Best for</strong></p>
<p>Small teams optimizing for cost.</p>
<p><strong>User signal</strong></p>
<p>Prospeo makes the most sense when cost discipline matters more than breadth.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="22-adaptio">22. Adapt.io</h2>
<p><strong>What it does</strong></p>
<p>Adapt.io is an older B2B lead platform that still shows up in evaluations.</p>
<p><strong>How I scored it</strong></p>
<p>I scored most dimensions between <strong>2/5</strong> and <strong>3/5</strong> because it is serviceable, public enough to understand, and less differentiated than more active products in the category. AI readiness stays <strong>1/5</strong> because I found no clear public evidence of agent-oriented docs.</p>
<p><strong>Pricing</strong></p>
<p>Free, <strong>$49</strong>, and <strong>$99</strong> public tiers.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Easy enough to understand.</p>
<p><strong>What will annoy you</strong></p>
<p>This is not where the category feels active.</p>
<p><strong>Best for</strong></p>
<p>Teams that already know the tool.</p>
<p><strong>User signal</strong></p>
<p>Adapt is still in evaluation sets mostly because it has been around for a while, not because the category feels centered there.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐☆☆☆ (2/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="23-seamlessai">23. Seamless.AI</h2>
<p><strong>What it does</strong></p>
<p>Seamless.AI is a high-awareness outbound data vendor.</p>
<p><strong>How I scored it</strong></p>
<p>I scored awareness-driven richness <strong>3/5</strong> because the outbound use case is obvious, but pricing, dev-friendliness, and stability all land lower because public API evaluation remains fuzzy and buyer skepticism is part of the market conversation. AI readiness is <strong>1/5</strong> because I found no clear public evidence.</p>
<p><strong>Pricing</strong></p>
<p>Free trial. Real pricing gets sales-led.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Awareness matters. Some teams buy the known brand.</p>
<p><strong>What will annoy you</strong></p>
<p>Trust issues and vague pricing.</p>
<p><strong>Best for</strong></p>
<p>Teams that want awareness and broad outbound utility.</p>
<p><strong>User signal</strong></p>
<p>This is one of the vendors where brand visibility outruns product trust in a lot of buyer conversations.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐☆☆☆ (2/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐☆☆☆ (2/5) | Dev ⭐⭐☆☆☆ (2/5) | Stability ⭐⭐☆☆☆ (2/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="24-datagma">24. Datagma</h2>
<p><strong>What it does</strong></p>
<p>Datagma is a lower-visibility API-first-ish alternative.</p>
<p><strong>How I scored it</strong></p>
<p>I scored pricing <strong>4/5</strong> because public entry pricing is visible. Richness is <strong>2/5</strong> because the proof footprint is smaller and the product looks narrower than higher-ranked vendors. Dev-friendliness and stability sit at <strong>3/5</strong> because it is testable without too much friction.</p>
<p><strong>Pricing</strong></p>
<p>Starts at <strong>$39/mo billed yearly</strong>.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Cheap enough to test. Worth a look if you want alternatives.</p>
<p><strong>What will annoy you</strong></p>
<p>Smaller proof footprint.</p>
<p><strong>Best for</strong></p>
<p>Buyers who want a lower-cost API-first option.</p>
<p><strong>User signal</strong></p>
<p>Datagma is the kind of vendor technical buyers try when they want to get outside the loud incumbent set.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐☆☆☆ (2/5) | Scalability ⭐⭐⭐☆☆ (3/5) | Pricing ⭐⭐⭐⭐☆ (4/5) | Dev ⭐⭐⭐☆☆ (3/5) | Stability ⭐⭐⭐☆☆ (3/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="25-coresignal">25. Coresignal</h2>
<p><strong>What it does</strong></p>
<p>Coresignal is closer to workforce and public-web data infrastructure than a clean general enrichment buy.</p>
<p><strong>How I scored it</strong></p>
<p>I scored scalability <strong>4/5</strong> because the API-plus-dataset model works for technical teams building data products. I scored richness <strong>3/5</strong> because workforce and company-web data can be useful, but this is not the cleanest general enrichment fit. Pricing is <strong>3/5</strong> because public API entry pricing starts at <strong>$49/mo</strong>, but dataset economics can expand quickly. AI readiness is <strong>1/5</strong> because I found no clear public machine-first AI docs layer.</p>
<p><strong>Pricing</strong></p>
<p>API starts at <strong>$49/mo</strong>. Datasets cost more.</p>
<p><strong>AI dimension</strong></p>
<ul>
<li>AI Skill: <strong>No clear public evidence found</strong></li>
<li>MCP or agent path: <strong>No clear public evidence found</strong></li>
<li>Markdown docs: <strong>No clear public evidence found</strong></li>
<li><code>llms.txt</code>: <strong>No clear public evidence found</strong></li>
<li>OpenAPI spec: <strong>No clear public evidence found</strong></li>
</ul>
<p><strong>What I like</strong></p>
<p>Useful if you care about workforce or company data layers.</p>
<p><strong>What will annoy you</strong></p>
<p>It is not the cleanest plug-and-play enrichment product.</p>
<p>Like PDL, it also lives near the LinkedIn-derived data conversation. If that matters to your counsel, read this: <a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">Is scraping LinkedIn legal in 2026?</a></p>
<p><strong>Best for</strong></p>
<p>Workforce intelligence and custom data products.</p>
<p><strong>User signal</strong></p>
<p>Coresignal makes the most sense when enrichment is one layer inside a larger data workflow, not the whole buying reason.</p>
<p><strong>Star rating summary</strong></p>
<p>Freshness ⭐⭐⭐☆☆ (3/5) | Richness ⭐⭐⭐☆☆ (3/5) | Scalability ⭐⭐⭐⭐☆ (4/5) | Pricing ⭐⭐⭐☆☆ (3/5) | Dev ⭐⭐⭐⭐☆ (4/5) | Stability ⭐⭐⭐⭐☆ (4/5) | AI ⭐☆☆☆☆ (1/5)</p>
<h2 id="what-most-buyers-miss">What most buyers miss</h2>
<h3 id="freshness-beats-field-count">Freshness beats field count</h3>
<p>Twenty wrong fields are worse than five right ones.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/CRM</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/bbonzoo</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">The CRM had one job. Give you context and help you figure out where to focus. Instead it became a dashboard for management.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/CRM/comments/1sshw3u/am_i_crazy_or_is_my_crm_literally_making_me_worse/ohmiq2l/?ref=nubela.co" rel="nofollow" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>A bigger field list does not help if the org changed, the exec left, or the company pivoted.</p>
<h3 id="credits-hide-real-cost">Credits hide real cost</h3>
<p>Most pricing spreadsheets are wrong because they model one pass.</p>
<p>Real cost is:</p>
<ul>
<li>initial enrichment</li>
<li>misses</li>
<li>premium fields</li>
<li>re-enrichment</li>
<li>waterfall fallback</li>
<li>webhook and ops overhead</li>
</ul>
<p>That is how a cheap API becomes an expensive one.</p>
<h3 id="workflow-fit-matters-more">Workflow fit matters more</h3>
<p>A wrong field is worse than a blank field.</p>
<p>Blank fields make your system cautious. Wrong fields make your reps overconfident.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/gtmengineering</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Waste-Ad3616</span>
<span style="color:#878a8c;">· ▲ 4</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Yeah I run GTME for an 80 person org, got rid of ZI and Lusha. I replaced it with a slack enrichment...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/gtmengineering/comments/1pd3odj/can_clay_be_my_main_enrichment_tool_instead_of/ns2fddc/?ref=nubela.co" rel="nofollow" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That thread was about tooling replacement, but the point is broader. Use-case mismatch breaks tools quickly.</p>
<h3 id="ai-readiness-is-now-real">AI-readiness is now real</h3>
<p>This is not a side issue anymore.</p>
<p>If your docs are hard for AI coding agents to consume, implementation gets slower and more brittle. Teams feel that immediately.</p>
<h2 id="my-hot-takes">My hot takes</h2>
<ul>
<li><strong>Freshness is the product.</strong> Old data with more fields is still old data.</li>
<li><strong>Opaque pricing is a product flaw.</strong> If I need a sales call to find out whether a tool is in budget, evaluation got harder for no good reason.</li>
<li><strong>Most all-in-one enrichment tools are really prospecting databases with an API attached.</strong> That changes how you should buy them.</li>
<li><strong>A wrong field is worse than a blank field.</strong> Blank makes software cautious. Wrong creates bad decisions.</li>
<li><strong>AI-readiness is not optional anymore.</strong> If Claude or Cursor cannot consume your docs, your developer experience is behind.</li>
<li><strong>Static enrichment is the start.</strong> The next question is what changed and why now.</li>
</ul>
<h2 id="final-picks-by-use-case">Final picks by use case</h2>
<p>If you want the short version:</p>
<h3 id="best-overall-data-enrichment-api">Best overall <code>data enrichment api</code></h3>
<p><strong>NinjaPear</strong></p>
<p>Because it is pointed at modern workflows: company intelligence, relationship mapping, monitoring, and AI-friendly docs.</p>
<h3 id="best-exact-match-generic-enrichment-api">Best exact-match generic enrichment API</h3>
<p><strong>EnrichmentAPI</strong></p>
<p>Because it is focused, public, and easy to reason about.</p>
<h3 id="best-builder-grade-data-layer">Best builder-grade data layer</h3>
<p><strong>People Data Labs</strong></p>
<p>Because it still feels like serious infrastructure, assuming you understand the freshness tradeoff and the LinkedIn data conversation.</p>
<h3 id="best-default-prospecting-stack-with-enrichment-included">Best default prospecting stack with enrichment included</h3>
<p><strong>Apollo</strong></p>
<p>Because it is still the broad convenience play, even if the API side gets more complex.</p>
<h3 id="best-for-hubspot-heavy-routing-workflows">Best for HubSpot-heavy routing workflows</h3>
<p><strong>Clearbit</strong></p>
<p>If you can tolerate opaque pricing.</p>
<h3 id="best-for-email-centric-enrichment">Best for email-centric enrichment</h3>
<p><strong>Hunter</strong></p>
<p>Simple. Focused. Usually enough.</p>
<h3 id="best-for-waterfall-orchestration">Best for waterfall orchestration</h3>
<p><strong>Clay</strong> if you need orchestration.</p>
<p><strong>LeadMagic</strong> if you want something more API-centered.</p>
<h3 id="best-for-enterprise-incumbency">Best for enterprise incumbency</h3>
<p><strong>ZoomInfo</strong></p>
<p>If you have budget and patience.</p>
<p>The actual advice is simple: stop asking which <code>data enrichment api</code> has the most fields. Ask which one fits your workflow, refresh cadence, and tolerance for pricing games.</p>
<p>If your real problem is timing, org change, competitor movement, or relationship mapping, generic enrichment is not enough. Start with <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>.</p>
<p>If your problem is simpler, test EnrichmentAPI and People Data Labs next.</p>
<p>And if you want to check your own cost model before you buy anything, use the calculator below. It will save you more money than another vendor call.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Data Enrichment API Cost + Refresh Calculator + AI Readiness Checklist</strong><br>
<span style="color:#555;">Use it to estimate monthly spend, re-enrichment load, cost per successful match, and whether a vendor’s docs are usable in an AI-assisted workflow.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/data-enrichment-api-cost-refresh-calculator-52b7c638.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="tldr">TL;DR</h2>
<p>This is the full market map. Average score is the sum of the 7 category scores divided by 7.</p>
<table>
<thead>
<tr>
<th>Vendor</th>
<th style="text-align: right;">Avg</th>
<th>Freshness</th>
<th>Richness</th>
<th>Scalability</th>
<th>Pricing</th>
<th>Dev-Friendly</th>
<th>Stability</th>
<th>AI Readiness</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear</td>
<td style="text-align: right;"><strong>4.43/5</strong></td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
</tr>
<tr>
<td>EnrichmentAPI</td>
<td style="text-align: right;"><strong>3.43/5</strong></td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>People Data Labs</td>
<td style="text-align: right;"><strong>3.86/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
</tr>
<tr>
<td>Apollo</td>
<td style="text-align: right;"><strong>2.86/5</strong></td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Clearbit</td>
<td style="text-align: right;"><strong>3.29/5</strong></td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td style="text-align: right;"><strong>3.14/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐☆☆☆☆ 1/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>FullContact</td>
<td style="text-align: right;"><strong>3.29/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
</tr>
<tr>
<td>Hunter</td>
<td style="text-align: right;"><strong>3.29/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Clay</td>
<td style="text-align: right;"><strong>3.43/5</strong></td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
</tr>
<tr>
<td>Crunchbase</td>
<td style="text-align: right;"><strong>3.29/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐⭐ 5/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Cognism</td>
<td style="text-align: right;"><strong>2.86/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>RocketReach</td>
<td style="text-align: right;"><strong>3.00/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>UpLead</td>
<td style="text-align: right;"><strong>2.86/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Dropcontact</td>
<td style="text-align: right;"><strong>2.86/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Clearout</td>
<td style="text-align: right;"><strong>2.86/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Snov.io</td>
<td style="text-align: right;"><strong>2.43/5</strong></td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Lusha</td>
<td style="text-align: right;"><strong>2.43/5</strong></td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>ContactOut</td>
<td style="text-align: right;"><strong>2.71/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>LeadMagic</td>
<td style="text-align: right;"><strong>3.29/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
</tr>
<tr>
<td>Kaspr</td>
<td style="text-align: right;"><strong>2.29/5</strong></td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Prospeo</td>
<td style="text-align: right;"><strong>2.71/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Adapt.io</td>
<td style="text-align: right;"><strong>2.29/5</strong></td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Seamless.AI</td>
<td style="text-align: right;"><strong>2.14/5</strong></td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Datagma</td>
<td style="text-align: right;"><strong>2.71/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐☆☆☆ 2/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
<tr>
<td>Coresignal</td>
<td style="text-align: right;"><strong>3.14/5</strong></td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐☆☆ 3/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐⭐⭐⭐☆ 4/5</td>
<td>⭐☆☆☆☆ 1/5</td>
</tr>
</tbody>
</table>
<p>That is the board.</p>
<p>If you want the most interesting thing to evaluate first, start with <strong>NinjaPear</strong>.</p>
<p>If you want a cleaner generic enrichment product, test <strong>EnrichmentAPI</strong>.</p>
<p>If you want serious builder infrastructure, test <strong>People Data Labs</strong>.</p>
<p>If you want convenience and can live with some complexity, Apollo is still there.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Crunchbase API: Ultimate Guide + Code + Pricing (2026) ]]></title>
        <description><![CDATA[ If you searched for Crunchbase API, the main thing to understand is simple: Crunchbase Basic is not the full Crunchbase API. Basic gives you 3 endpoints. Full API access requires an Enterprise or Applications license. I also included a public GitHub repo in this guide so you can clone the ]]></description>
        <link>https://nubela.co/blog/crunchbase-api/</link>
        <guid isPermaLink="false">69f02f1cb95fe7000179b224</guid>
        <category><![CDATA[ crunchbase api ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Tue, 28 Apr 2026 11:53:01 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_14-2.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you searched for <strong>Crunchbase API</strong>, the main thing to understand is simple: <strong>Crunchbase Basic is not the full Crunchbase API</strong>. Basic gives you 3 endpoints. Full API access requires an <strong>Enterprise or Applications license</strong>. I also included a public GitHub repo in this guide so you can clone the sample scripts and start testing right away.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SaaS</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/gorjuce</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I'm a PhD student researching AI startups in Silicon Valley. To get a list of relevant companies, I subscribed to Crunchbase Pro ($99/month), thinking I could export the data... but it turns out exports are disabled for new subscribers since October 7, 2024... So basically, I just wasted $99...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SaaS/comments/1irmlau/crunchbase_pro_doesnt_allow_exports_anymorei_paid/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is the whole story in one sentence. People think they bought data access. What they often bought was a much smaller surface area.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="github-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f6f8fa;">
<strong>💻 Full code on GitHub: crunchbase-api-vs-ninjapear-scripts-2026</strong><br>
<span style="color:#555;">Runnable sample scripts for CRM enrichment, prospecting, investor research, account prep, monitoring, and customer-facing product patterns.</span><br>
<code style="display:inline-block;margin-top:10px;padding:6px 10px;background:#eaecef;border-radius:4px;font-family:monospace;font-size:13px;">git clone https://github.com/NinjaPear-Shares/crunchbase-api-vs-ninjapear-scripts-2026.git</code><br>
<a href="https://github.com/NinjaPear-Shares/crunchbase-api-vs-ninjapear-scripts-2026?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#24292f;color:#fff;border-radius:6px;text-decoration:none;">View on GitHub →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="what-crunchbase-api-actually-is">What Crunchbase API actually is</h2>
<p>Crunchbase’s public API is a read-only REST API. You ask for records. You get JSON back. There is no mystery there.</p>
<p>The public API has three core motions:</p>
<ol>
<li><strong>Autocomplete</strong>: you have a fuzzy company name and need a canonical match.</li>
<li><strong>Entity lookup</strong>: you know the company and want its record.</li>
<li><strong>Search</strong>: you want a filtered list of companies.</li>
</ol>
<p>Then there is a richer layer on top of that: related cards and broader entity families in full API access.</p>
<p>If you are building against Crunchbase, most flows look like this:</p>
<ul>
<li>resolve a name with <code>Autocomplete</code></li>
<li>fetch the company with <code>Organization Entity Lookup</code></li>
<li>optionally add related cards like funding rounds, investors, or acquisitions</li>
<li>repeat at scale with <code>Search</code></li>
</ul>
<p>That is the product, in practical terms.</p>
<h2 id="how-access-actually-works">How access actually works</h2>
<p>This part makes more sense once you know the API surface.</p>
<h3 id="crunchbase-basic">Crunchbase Basic</h3>
<p>Crunchbase support docs say <strong>Basic users can provision an API key</strong>.</p>
<p>That is true. It is also easy to overread.</p>
<p>Basic does not mean full API access. It means access to exactly three endpoints:</p>
<ol>
<li><code>Organization Search</code></li>
<li><code>Organization Entity Lookup</code></li>
<li><code>Autocomplete</code></li>
</ol>
<p>That is enough to test the core workflow.</p>
<p>It is <strong>not</strong> the same thing as full Crunchbase API access.</p>
<p><img alt="Crunchbase Basic API page showing the 3-endpoint limit" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/26f0d0fb4a07-2.webp" /></p>
<h3 id="full-api-access">Full API access</h3>
<p>Crunchbase says this directly on the Using the API page:</p>
<blockquote>
<p><strong>“Access to the Full API Requires an Enterprise or Applications License.”</strong></p>
</blockquote>
<p>That is the line that matters.</p>
<p>If you need broader access than Basic, you are in a licensing motion. Not a normal self-serve checkout motion.</p>
<p><img alt="Crunchbase docs showing full API license requirement and 200 calls/min rate limit" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/64dcca34d886-2.webp" /></p>
<h3 id="the-99-question">The $99 question</h3>
<p>From the public docs in this guide, I <strong>cannot</strong> say that a $99 Crunchbase plan gives you full API access.</p>
<p>The docs point the other way. Full API access requires <strong>Enterprise or Applications licensing</strong>.</p>
<p>So if your internal question is:</p>
<blockquote>
<p>“Can I pay for a normal Crunchbase plan and get the full API?”</p>
</blockquote>
<p>The answer from the public evidence here is: <strong>do not assume that</strong>.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/startups</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Practical-Drawing-90</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">What happened to Crunchbase? ... Heat points?? Growth score?? I want my visitors per month and average monthly visitors...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/startups/comments/1jeiklv/new_crunchbase_is_trash_i_will_not_promote/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Different complaint, same pattern. The disappointment often comes from misunderstanding the boundary.</p>
<h3 id="auth-is-simple">Auth is simple</h3>
<p>To be fair, authentication is not the hard part.</p>
<pre><code class="language-bash">curl 'https://api.crunchbase.com/api/v4/entities/organizations/crunchbase' \
  -H 'X-cb-user-key: YOUR_KEY'
</code></pre>
<p>You can pass the API key as:</p>
<ul>
<li><code>user_key</code> in the URL</li>
<li><code>X-cb-user-key</code> in the header</li>
</ul>
<p>That part is clean.</p>
<h2 id="reverse-engineering-crunchbases-internal-graphql-and-dashboard-api">Reverse engineering Crunchbase’s internal GraphQL and dashboard API</h2>
<p>Short warning: <strong>using Crunchbase’s internal dashboard requests instead of the sanctioned API can breach Crunchbase’s terms of service</strong>.</p>
<p>Now the useful part.</p>
<p>There are public signs that people do exactly this when they want exports or broader access without proper API licensing:</p>
<ul>
<li>Apify actors that ask for a logged-in Crunchbase search URL plus browser cookies</li>
<li>scraper repos that automate Crunchbase search pages and organization pages</li>
<li>vendors selling Crunchbase scraping APIs instead of telling you to use the official REST API</li>
</ul>
<p>That tells you what the real playbook looks like.</p>
<p>The common techniques are usually:</p>
<ol>
<li>replay internal authenticated requests from a logged-in browser session</li>
<li>drive a logged-in browser and extract rendered rows or JSON payloads</li>
</ol>
<p>The first is cleaner when it works.</p>
<h3 id="how-people-find-the-internal-requests">How people find the internal requests</h3>
<p>The usual workflow is straightforward:</p>
<ol>
<li>Log in to Crunchbase in Chrome.</li>
<li>Open DevTools.</li>
<li>Go to the <strong>Network</strong> tab.</li>
<li>Filter by <code>fetch</code> or <code>XHR</code>.</li>
<li>Open a Crunchbase search page or company page.</li>
<li>Look for requests with JSON payloads, GraphQL-style <code>operationName</code> fields, or large filter objects.</li>
<li>Right-click the interesting request and copy it as cURL or HAR.</li>
</ol>
<p>In practice, the requests you see tend to look like one of these:</p>
<ul>
<li><code>POST</code> to a GraphQL endpoint with <code>operationName</code>, <code>variables</code>, and maybe <code>extensions</code></li>
<li><code>POST</code> to an internal search endpoint with filters and selected fields in JSON</li>
<li><code>GET</code> with a large encoded filter blob in the query string</li>
</ul>
<p>The exact path can change. That is one reason these flows are fragile.</p>
<h3 id="what-auth-usually-looks-like">What auth usually looks like</h3>
<p>Internal requests often depend on one or more of these:</p>
<ul>
<li>session cookies</li>
<li>CSRF or anti-forgery headers</li>
<li>request headers like <code>x-requested-with</code></li>
<li>a bearer token in browser storage</li>
<li>a persisted GraphQL query hash</li>
</ul>
<p>The simplest path is still the practical one:</p>
<ul>
<li>log in normally</li>
<li>copy the working request from DevTools</li>
<li>replay it before the session expires</li>
</ul>
<p>That is also why public Apify flows tell users to export cookies.</p>
<h3 id="sample-script-replay-a-copied-graphql-request">Sample script: replay a copied GraphQL request</h3>
<p>Replace the placeholders below with the values from a real DevTools request you copied from a logged-in Crunchbase session.</p>
<pre><code class="language-python">import json
import requests

session = requests.Session()

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Origin': 'https://www.crunchbase.com',
    'Referer': 'https://www.crunchbase.com/',
    'x-csrf-token': 'YOUR_CSRF_TOKEN',
}

cookies = {
    'session': 'YOUR_SESSION_COOKIE',
}

payload = {
    'operationName': 'YOUR_OPERATION_NAME',
    'variables': {
        'page': 1,
        'limit': 50,
        'query': 'fintech',
        'filters': []
    },
    'query': 'YOUR_REAL_QUERY_OR_HASH'
}

r = session.post(
    'https://www.crunchbase.com/graphql',
    headers=headers,
    cookies=cookies,
    data=json.dumps(payload),
    timeout=30,
)

print(r.status_code)
print(r.text[:2000])
</code></pre>
<p>Sometimes the endpoint is not literally <code>/graphql</code>. Sometimes the request uses <code>extensions.persistedQuery</code> instead of a raw <code>query</code> string. That is why the right starting point is <strong>Copy as cURL</strong>, not guessing.</p>
<h3 id="sample-script-start-from-copy-as-curl">Sample script: start from Copy as cURL</h3>
<p>This is usually the fastest route.</p>
<ol>
<li>Right-click the working request in DevTools.</li>
<li>Choose <strong>Copy as cURL</strong>.</li>
<li>Paste it somewhere safe.</li>
<li>Convert it to Python manually or with a converter.</li>
</ol>
<p>Skeleton:</p>
<pre><code class="language-python">import requests

url = 'https://www.crunchbase.com/YOUR_REAL_INTERNAL_ENDPOINT'

headers = {
    'accept': 'application/json',
    'content-type': 'application/json',
    'origin': 'https://www.crunchbase.com',
    'referer': 'https://www.crunchbase.com/discover/organization.companies',
    'user-agent': 'Mozilla/5.0',
    'x-csrf-token': 'PASTE_FROM_CURL',
}

cookies = {
    'PASTE_COOKIE_NAME': 'PASTE_COOKIE_VALUE',
}

payload = {
    # paste the real JSON body from the copied request
}

r = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)
print(r.status_code)
print(r.json())
</code></pre>
<p>A copied request usually gives you:</p>
<ul>
<li>the real URL</li>
<li>the real headers</li>
<li>the real cookies</li>
<li>the real payload shape</li>
</ul>
<p>That is most of the work.</p>
<h3 id="sample-script-paginate-search-exports">Sample script: paginate search exports</h3>
<p>Once you have one working internal search request, paginating it is usually straightforward because the payload often carries page or offset controls.</p>
<pre><code class="language-python">import requests
import time

session = requests.Session()

headers = {
    'accept': 'application/json',
    'content-type': 'application/json',
    'origin': 'https://www.crunchbase.com',
    'referer': 'https://www.crunchbase.com/discover/organization.companies',
    'user-agent': 'Mozilla/5.0',
    'x-csrf-token': 'YOUR_CSRF_TOKEN',
}

cookies = {
    'session': 'YOUR_SESSION_COOKIE',
}

base_url = 'https://www.crunchbase.com/YOUR_REAL_INTERNAL_SEARCH_ENDPOINT'
results = []

for page in range(1, 6):
    payload = {
        'operationName': 'YOUR_OPERATION_NAME',
        'variables': {
            'page': page,
            'limit': 50,
            'filters': [],
            'field_ids': ['identifier', 'short_description']
        },
        'query': 'YOUR_REAL_QUERY_OR_HASH'
    }

    r = session.post(base_url, headers=headers, cookies=cookies, json=payload, timeout=30)
    r.raise_for_status()
    data = r.json()
    results.append(data)
    print(f'fetched page {page}')
    time.sleep(2)

print(f'total pages fetched: {len(results)}')
</code></pre>
<p>The key idea is simple: copy a working request, then vary only the paging variables.</p>
<h3 id="sample-script-browser-automation-fallback">Sample script: browser automation fallback</h3>
<p>If replaying internal requests gets blocked, the common fallback is browser automation on a logged-in session.</p>
<p>That is why public Crunchbase scraping repos often lean on Selenium or remote browsers.</p>
<p>Minimal shape:</p>
<pre><code class="language-python">from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('https://www.crunchbase.com/login')

print('Log in manually, then press Enter here...')
input()

search_url = 'https://www.crunchbase.com/discover/organization.companies'
driver.get(search_url)
time.sleep(5)

rows = driver.find_elements(By.CSS_SELECTOR, 'grid-row, [role=&quot;row&quot;]')
print(f'rows found: {len(rows)}')

for row in rows[:5]:
    print(row.text)

driver.quit()
</code></pre>
<p>This is heavier than replaying JSON, but sometimes it is the faster way through a changing frontend.</p>
<h3 id="what-usually-breaks">What usually breaks</h3>
<p>The usual failure modes are predictable:</p>
<ul>
<li>session cookies expire</li>
<li>CSRF token rotates</li>
<li>persisted query hash changes</li>
<li>GraphQL schema or field names change</li>
<li>anti-bot checks kick in</li>
<li>the table UI changes</li>
</ul>
<p>This is why these workarounds tend to turn into maintenance projects.</p>
<h2 id="endpoint-breakdown">Endpoint breakdown</h2>
<h3 id="autocomplete">Autocomplete</h3>
<p><strong>Endpoint:</strong> <code>GET /api/v4/autocompletes</code></p>
<p>Use this when your input is messy. A user types <code>open ai</code>. A CRM field says <code>stripe inc</code>. You need the canonical entity.</p>
<p>What it gives you:</p>
<ul>
<li>suggested matches</li>
<li>canonical identifiers</li>
<li>permalinks to feed into lookup calls</li>
</ul>
<p>Example:</p>
<pre><code class="language-bash">curl 'https://api.crunchbase.com/api/v4/autocompletes?query=stripe' \
  -H 'X-cb-user-key: YOUR_KEY'
</code></pre>
<p>This is a helper endpoint. It is not where the interesting data lives. It is what keeps the rest of your pipeline from being garbage.</p>
<h3 id="organization-entity-lookup">Organization Entity Lookup</h3>
<p><strong>Endpoint:</strong> <code>GET /api/v4/entities/organizations/{permalink}</code></p>
<p>This is the workhorse.</p>
<p>Once you have a valid permalink, this endpoint returns the core organization record. Public docs and examples show fields around:</p>
<ul>
<li><code>identifier</code></li>
<li><code>permalink</code></li>
<li><code>uuid</code></li>
<li><code>short_description</code></li>
<li><code>website</code></li>
<li>category references</li>
<li>location references</li>
<li><code>founded_on</code></li>
<li>rank fields like <code>rank_org_company</code></li>
</ul>
<p>Trimmed sample response shape based on Crunchbase docs/examples:</p>
<pre><code class="language-json">{
  &quot;properties&quot;: {
    &quot;identifier&quot;: {
      &quot;value&quot;: &quot;Crunchbase&quot;,
      &quot;permalink&quot;: &quot;crunchbase&quot;,
      &quot;entity_def_id&quot;: &quot;organization&quot;
    },
    &quot;short_description&quot;: &quot;Crunchbase is a prospecting platform...&quot;,
    &quot;rank_org_company&quot;: 1234
  }
}
</code></pre>
<p>Example:</p>
<pre><code class="language-bash">curl 'https://api.crunchbase.com/api/v4/entities/organizations/crunchbase' \
  -H 'X-cb-user-key: YOUR_KEY'
</code></pre>
<p>This is the endpoint you use for:</p>
<ul>
<li>CRM enrichment</li>
<li>internal company profiles</li>
<li>pre-call research</li>
<li>startup research</li>
<li>grounding any workflow in a known company record</li>
</ul>
<h3 id="organization-search">Organization Search</h3>
<p><strong>Endpoint:</strong> <code>POST /api/v4/searches/organizations</code></p>
<p>This is the list builder.</p>
<p>Use it when you do not know the exact company yet and need a filtered set of organizations.</p>
<p>Crunchbase docs show support for JSON request bodies with things like:</p>
<ul>
<li><code>field_ids</code></li>
<li><code>query</code></li>
<li>category filters</li>
<li>location filters</li>
<li>funding filters</li>
<li>employee range enums like <code>num_employees_enum</code></li>
</ul>
<p>The docs also say:</p>
<ul>
<li>default page size: <strong>50</strong></li>
<li>max page size: <strong>1000</strong></li>
</ul>
<p>That matters if you are bulk-enriching or backfilling data.</p>
<p>Example:</p>
<pre><code class="language-python">import requests

r = requests.post(
  'https://api.crunchbase.com/api/v4/searches/organizations',
  headers={'X-cb-user-key': 'YOUR_KEY'},
  json={
    'field_ids': ['identifier', 'short_description']
  }
)
print(r.json())
</code></pre>
<p>Trimmed sample response shape based on docs/examples:</p>
<pre><code class="language-json">{
  &quot;entities&quot;: [
    {
      &quot;identifier&quot;: {
        &quot;value&quot;: &quot;Stripe&quot;,
        &quot;permalink&quot;: &quot;stripe&quot;
      },
      &quot;short_description&quot;: &quot;Stripe is a financial infrastructure platform.&quot;
    },
    {
      &quot;identifier&quot;: {
        &quot;value&quot;: &quot;Adyen&quot;,
        &quot;permalink&quot;: &quot;adyen&quot;
      },
      &quot;short_description&quot;: &quot;Adyen is a payments technology company.&quot;
    }
  ]
}
</code></pre>
<p>This is what you use for:</p>
<ul>
<li>prospect list seeding</li>
<li>startup discovery</li>
<li>market mapping</li>
<li>filtered company exports into your own workflows</li>
</ul>
<h3 id="related-cards">Related cards</h3>
<p>This is where Crunchbase gets more interesting.</p>
<p>Once you have an organization, you can request related cards for richer data. Public examples and docs reference cards around:</p>
<ul>
<li>raised funding rounds</li>
<li>investor participation</li>
<li>acquisitions</li>
<li>founder or leadership context</li>
</ul>
<p>Example:</p>
<pre><code class="language-bash">curl 'https://api.crunchbase.com/api/v4/entities/organizations/openai?card_ids=raised_funding_rounds' \
  -H 'X-cb-user-key: YOUR_KEY'
</code></pre>
<p>Trimmed sample response shape:</p>
<pre><code class="language-json">{
  &quot;cards&quot;: {
    &quot;raised_funding_rounds&quot;: [
      {
        &quot;identifier&quot;: {&quot;value&quot;: &quot;Series C&quot;},
        &quot;announced_on&quot;: &quot;2023-01-01&quot;,
        &quot;money_raised&quot;: {&quot;value_usd&quot;: 1000000000}
      }
    ]
  }
}
</code></pre>
<p>This is the layer that makes Crunchbase useful for investor research and private-market history, not just company pages.</p>
<h2 id="what-crunchbase-basic-actually-gives-you">What Crunchbase Basic actually gives you</h2>
<p>Crunchbase’s Basic API docs are very clear here.</p>
<p>Basic gives you exactly <strong>3 endpoints</strong>:</p>
<ol>
<li><code>Organization Search</code></li>
<li><code>Organization Entity Lookup</code></li>
<li><code>Autocomplete</code></li>
</ol>
<p>That is enough to test the core workflow.</p>
<p>It is <strong>not</strong> the same thing as full Crunchbase API access.</p>
<p>That distinction is the first thing I would tell any engineer before they write a single line of integration code.</p>
<h2 id="what-data-you-can-realistically-pull">What data you can realistically pull</h2>
<p>This is the endpoint view translated into data jobs.</p>
<h3 id="company-identity">Company identity</h3>
<p>Mostly from:</p>
<ul>
<li><code>Autocomplete</code></li>
<li><code>Organization Entity Lookup</code></li>
</ul>
<p>Useful fields include:</p>
<ul>
<li>company name</li>
<li>permalink</li>
<li>UUID</li>
<li>website or domain</li>
<li>short description</li>
<li>rank fields</li>
</ul>
<p>This is your anchor layer.</p>
<h3 id="firmographic-context">Firmographic context</h3>
<p>Mostly from:</p>
<ul>
<li><code>Organization Entity Lookup</code></li>
<li><code>Organization Search</code></li>
</ul>
<p>Useful fields and filters include:</p>
<ul>
<li>location</li>
<li>categories</li>
<li>founded date</li>
<li>employee range enums</li>
<li>company profile context</li>
<li>funding-related search filters</li>
</ul>
<p>This is where Crunchbase works well for segmentation and basic enrichment.</p>
<h3 id="funding-and-investors">Funding and investors</h3>
<p>Mostly from:</p>
<ul>
<li><code>Organization Entity Lookup</code> with cards</li>
<li>broader full-API entity relationships when licensed</li>
</ul>
<p>Useful data includes:</p>
<ul>
<li>funding rounds</li>
<li>announced dates</li>
<li>amount raised</li>
<li>investor relationships</li>
<li>acquisitions context</li>
<li>private-market history</li>
</ul>
<p>This is still the main reason to buy Crunchbase.</p>
<h3 id="people-and-leadership-context">People and leadership context</h3>
<p>Mostly from:</p>
<ul>
<li>people-related cards and fuller licensed access</li>
</ul>
<p>This gives you founder and executive context.</p>
<p>It is useful. It is also not the same thing as GTM-ready people enrichment or contactability.</p>
<h3 id="discovery-support">Discovery support</h3>
<p>Mostly from:</p>
<ul>
<li><code>Organization Search</code></li>
<li><code>Autocomplete</code></li>
</ul>
<p>Use these when your question is not “tell me about company X” but “show me companies that fit this shape.”</p>
<h2 id="crunchbase-api-pricing">Crunchbase API pricing</h2>
<p>This section is short because public pricing information is short.</p>
<h3 id="what-is-public">What is public</h3>
<p>From public docs and support pages, we can verify:</p>
<ul>
<li>Basic access exists</li>
<li>Basic users can provision an API key</li>
<li>full API requires Enterprise or Applications licensing</li>
<li>documented rate limit is <strong>200 calls/minute</strong></li>
<li>API customers get <strong>live company data at scale with unlimited exports</strong></li>
<li>Business plan customers get <strong>5K data exports per month</strong></li>
</ul>
<p>That tells you Crunchbase treats API customers and UI customers as different commercial tracks.</p>
<p><img alt="Crunchbase support doc showing Basic key provisioning and API positioning" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/69f93edd81d1-2.webp" /></p>
<h3 id="what-is-not-public">What is not public</h3>
<p>There is <strong>no clean public self-serve full API price</strong> in the material here.</p>
<p>So if you need full API breadth, the public path points you toward a licensing conversation.</p>
<p>That matters because it changes how engineers test and how teams budget.</p>
<h3 id="why-this-matters-by-buyer-type">Why this matters by buyer type</h3>
<p><strong>Founder or builder:</strong> this slows cheap experimentation.</p>
<p><strong>RevOps team:</strong> this makes budgeting messy.</p>
<p><strong>Enterprise buyer:</strong> this is less unusual.</p>
<p><strong>Customer-facing product team:</strong> rights matter as much as price.</p>
<p>Most teams think they are buying rows. They are actually buying permission.</p>
<h3 id="payg-contrast">PAYG contrast</h3>
<p>This is where <a href="https://nubela.co/pricing?ref=nubela.co">NinjaPear Pricing</a> is easier to reason about.</p>
<p>Publicly visible right now:</p>
<ul>
<li><strong>3-day free trial</strong></li>
<li><strong>10 credits included</strong></li>
<li>PAYG credits valid for <strong>18 months</strong></li>
<li>Customer Listing pricing of <strong>1 credit/request + 2 credits/customer returned</strong></li>
</ul>
<p>On public product pages, NinjaPear also shows:</p>
<ul>
<li>Company Details: <strong>2 credits per call</strong></li>
<li>Employee Count: <strong>2 credits per call</strong></li>
<li>Company Updates: <strong>2 credits per call</strong></li>
<li>Company Funding: <strong>2+ credits per call</strong></li>
</ul>
<p><img alt="NinjaPear pricing page with free trial and credit pricing" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/72f84f643700-2.webp" /></p>
<p>If you want to run real calls before talking to anyone, that difference matters.</p>
<h2 id="use-case-crm-enrichment">Use case: CRM enrichment</h2>
<h3 id="the-problem">The problem</h3>
<p>Your CRM has company names and maybe domains. Reps need enough context to stop guessing.</p>
<p>The minimum viable Crunchbase chain is:</p>
<ul>
<li><code>Autocomplete</code></li>
<li><code>Organization Entity Lookup</code></li>
<li>optional funding card if licensed</li>
</ul>
<p>That gives you identity plus a usable company profile.</p>
<h3 id="short-code-snippet">Short code snippet</h3>
<pre><code class="language-python">import requests

r = requests.get(
  'https://api.crunchbase.com/api/v4/entities/organizations/stripe',
  headers={'X-cb-user-key': 'YOUR_KEY'}
)
print(r.json())
</code></pre>
<h3 id="sample-response">Sample response</h3>
<p>Trimmed sample response shape based on docs/examples:</p>
<pre><code class="language-json">{
  &quot;properties&quot;: {
    &quot;identifier&quot;: {
      &quot;value&quot;: &quot;Stripe&quot;,
      &quot;permalink&quot;: &quot;stripe&quot;
    },
    &quot;short_description&quot;: &quot;Stripe is a financial infrastructure platform.&quot;,
    &quot;website&quot;: {&quot;value&quot;: &quot;https://stripe.com&quot;},
    &quot;founded_on&quot;: {&quot;value&quot;: &quot;2010-01-01&quot;}
  }
}
</code></pre>
<h3 id="where-it-falls-short">Where it falls short</h3>
<p>This is static enrichment. It does not tell you:</p>
<ul>
<li>what changed this week</li>
<li>who buys from them</li>
<li>who they compete with</li>
<li>whether sales should care right now</li>
</ul>
<h3 id="closest-ninjapear-alternative">Closest NinjaPear alternative</h3>
<p>For this workflow, the closest <a href="https://nubela.co/companies?ref=nubela.co">NinjaPear</a> mapping is:</p>
<ul>
<li>Company Details</li>
<li>Employee Count</li>
<li>Company Updates if freshness matters</li>
<li>NinjaPear for Claude if your team wants enrichment inside AI workflows</li>
</ul>
<h2 id="use-case-prospect-list-building">Use case: prospect list building</h2>
<h3 id="the-problem_1">The problem</h3>
<p>You want a list of companies that match a thesis. Not a bag of random logos.</p>
<p>The Crunchbase chain is:</p>
<ul>
<li><code>Organization Search</code></li>
<li><code>Organization Entity Lookup</code></li>
<li>optional people or funding cards if licensed</li>
</ul>
<p>Use <code>Search</code> to get the candidate set. Use <code>Entity Lookup</code> to flesh out the winners.</p>
<h3 id="short-code-snippet_1">Short code snippet</h3>
<pre><code class="language-python">import requests

r = requests.post(
  'https://api.crunchbase.com/api/v4/searches/organizations',
  headers={'X-cb-user-key': 'YOUR_KEY'},
  json={
    'field_ids': ['identifier', 'short_description']
  }
)
print(r.json())
</code></pre>
<h3 id="where-it-falls-short_1">Where it falls short</h3>
<p>A prospect list is not a pipeline list.</p>
<p>You still need:</p>
<ul>
<li>timing</li>
<li>fit</li>
<li>relationship context</li>
<li>some reason for now</li>
</ul>
<h3 id="closest-ninjapear-alternative_1">Closest NinjaPear alternative</h3>
<p>This is where <a href="https://nubela.co/companies?ref=nubela.co">Customer API</a> and Competitor API feel more GTM-native:</p>
<ul>
<li>Customer API for finding who buys from a company or category player</li>
<li>Competitor API for adjacency and similar-company discovery</li>
<li>Company Details for enrichment after discovery</li>
</ul>
<h2 id="use-case-investor-research">Use case: investor research</h2>
<h3 id="the-problem_2">The problem</h3>
<p>You need startup, round, investor, and acquisition context fast.</p>
<p>This is where Crunchbase is strongest.</p>
<p>The typical chain is:</p>
<ul>
<li><code>Organization Entity Lookup</code></li>
<li>funding-related cards</li>
<li>investor-related cards</li>
<li>acquisition cards where relevant</li>
</ul>
<h3 id="short-code-snippet_2">Short code snippet</h3>
<pre><code class="language-bash">curl 'https://api.crunchbase.com/api/v4/entities/organizations/openai?card_ids=raised_funding_rounds' \
  -H 'X-cb-user-key: YOUR_KEY'
</code></pre>
<h3 id="sample-response_1">Sample response</h3>
<p>Trimmed sample response shape based on docs/examples:</p>
<pre><code class="language-json">{
  &quot;cards&quot;: {
    &quot;raised_funding_rounds&quot;: [
      {
        &quot;identifier&quot;: {&quot;value&quot;: &quot;Series C&quot;},
        &quot;announced_on&quot;: &quot;2023-01-01&quot;,
        &quot;money_raised&quot;: {&quot;value_usd&quot;: 1000000000}
      }
    ]
  }
}
</code></pre>
<h3 id="my-take">My take</h3>
<p>Crunchbase wins here.</p>
<p>If funding data is the job, this is where it is strongest.</p>
<h3 id="where-ninjapear-fits-instead">Where NinjaPear fits instead</h3>
<p>Use NinjaPear when the question changes from:</p>
<ul>
<li>“who raised?” to</li>
<li>“what changed?”</li>
<li>“who are their customers?”</li>
<li>“who competes with them?”</li>
<li>“should sales care now?”</li>
</ul>
<p>Closest mappings:</p>
<ul>
<li>Company Funding</li>
<li>Company Updates</li>
<li>Customer API</li>
<li>Competitor API</li>
</ul>
<h2 id="use-case-account-research">Use case: account research</h2>
<h3 id="the-problem_3">The problem</h3>
<p>A rep has a meeting tomorrow and wants context that is useful.</p>
<p>The Crunchbase chain is:</p>
<ul>
<li><code>Autocomplete</code></li>
<li><code>Organization Entity Lookup</code></li>
<li>optional people or funding cards if licensed</li>
</ul>
<p>That gives you a decent pre-call brief.</p>
<h3 id="what-it-misses">What it misses</h3>
<p>Usually the actual trigger to act.</p>
<p>That might be:</p>
<ul>
<li>a pricing page change</li>
<li>a product launch post</li>
<li>expansion hiring</li>
<li>customer adjacency</li>
<li>competitor overlap</li>
</ul>
<h3 id="closest-ninjapear-alternative_2">Closest NinjaPear alternative</h3>
<p>Stronger fit here:</p>
<ul>
<li><a href="https://nubela.co/company-monitor?ref=nubela.co">Company Monitor</a></li>
<li>Monitor API</li>
<li>Employee API</li>
<li>Customer Listing</li>
<li>Competitor API</li>
</ul>
<h3 id="short-ninjapear-snippet">Short NinjaPear snippet</h3>
<pre><code class="language-bash">curl -G 'https://nubela.co/api/v1/customer/listing' \
  --data-urlencode 'website=https://stripe.com' \
  -H 'Authorization: Bearer YOUR_API_KEY'
</code></pre>
<h3 id="sample-response_2">Sample response</h3>
<p>Trimmed sample response shape based on public docs:</p>
<pre><code class="language-json">{
  &quot;company&quot;: &quot;Stripe&quot;,
  &quot;customers&quot;: [
    {
      &quot;company_name&quot;: &quot;Shopify&quot;,
      &quot;website&quot;: &quot;shopify.com&quot;,
      &quot;relationship_type&quot;: &quot;customer&quot;
    },
    {
      &quot;company_name&quot;: &quot;Lyft&quot;,
      &quot;website&quot;: &quot;lyft.com&quot;,
      &quot;relationship_type&quot;: &quot;customer&quot;
    }
  ]
}
</code></pre>
<h2 id="use-case-watchlists-and-monitoring">Use case: watchlists and monitoring</h2>
<h3 id="the-problem_4">The problem</h3>
<p>You do not want a static company record. You want to know when the company moves.</p>
<p>From the public Crunchbase materials in this guide, the API is <strong>not</strong> positioned as a blog, X, and website monitoring product.</p>
<p>You can build repeated search and repeated lookup flows. That is not the same thing as a first-class monitoring system.</p>
<h3 id="why-this-matters">Why this matters</h3>
<p>For GTM, timing beats trivia.</p>
<h3 id="closest-ninjapear-alternative_3">Closest NinjaPear alternative</h3>
<p>This is where <a href="https://nubela.co/company-monitor?ref=nubela.co">Company Monitor</a> is the better fit:</p>
<ul>
<li>Monitor API</li>
<li>Company Updates</li>
<li>AI-filtered changes across blog, website, and X</li>
</ul>
<h3 id="short-workflow-snippet">Short workflow snippet</h3>
<pre><code class="language-text">Create feed in NinjaPear Monitor API -&gt; poll RSS/API -&gt; push meaningful changes to Slack or CRM
</code></pre>
<h3 id="sample-output">Sample output</h3>
<pre><code class="language-xml">&lt;item&gt;
  &lt;title&gt;Stripe: New Checkout Experience for Global Payments&lt;/title&gt;
  &lt;category&gt;blog&lt;/category&gt;
  &lt;pubDate&gt;Thu, 27 Feb 2026 10:00:00 GMT&lt;/pubDate&gt;
&lt;/item&gt;
</code></pre>
<h2 id="use-case-customer-facing-products">Use case: customer-facing products</h2>
<h3 id="the-problem_5">The problem</h3>
<p>You want to put company data inside your own product.</p>
<p>This is where data buying turns into rights buying.</p>
<p>Crunchbase explicitly separates:</p>
<ul>
<li><strong>Data Enrichment</strong>, for internal workflows</li>
<li><strong>Data Licensing</strong>, for customer-facing products</li>
</ul>
<h3 id="the-catch">The catch</h3>
<p>Before you ship anything, ask:</p>
<ul>
<li>can I display this data to my users?</li>
<li>do I need attribution?</li>
<li>do links need to be visible and spiderable?</li>
<li>can I redistribute raw data?</li>
<li>what happens if the contract ends?</li>
</ul>
<h3 id="closest-ninjapear-alternative_4">Closest NinjaPear alternative</h3>
<p>NinjaPear is cleaner here when the buyer wants:</p>
<ul>
<li>self-serve testing first</li>
<li>PAYG motion</li>
<li>AI-agent docs</li>
<li>customer, competitor, employee, and monitoring data in one stack</li>
</ul>
<p>Still, read the terms.</p>
<h2 id="workflow-pricing-cards">Workflow pricing cards</h2>
<p>I am not going to make up Crunchbase numbers that are not public. So here is the honest version.</p>
<h3 id="crm-enrichment">CRM enrichment</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem</td>
<td>Enrich 500 CRM accounts with company context</td>
<td>Enrich 500 CRM accounts with company context</td>
</tr>
<tr>
<td>Crunchbase endpoints needed</td>
<td>Autocomplete → Organization Entity Lookup</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase access motion</td>
<td><strong>Basic may cover starter org enrichment</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase public price?</td>
<td><strong>Basic exists, public full API price not shown</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>NinjaPear endpoints needed</td>
<td>N/A</td>
<td>Company Details, optional Employee Count</td>
</tr>
<tr>
<td>NinjaPear known credit math?</td>
<td>N/A</td>
<td>Company Details shows <strong>2 credits/call</strong></td>
</tr>
<tr>
<td>Best practical takeaway</td>
<td>Start with Basic if you only need basic org fields. If you need broader cards or product embedding, expect a licensing conversation.</td>
<td>Good fit if you want to test immediately and care about fresh company details.</td>
</tr>
</tbody>
</table>
<h3 id="prospect-list-building">Prospect list building</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem</td>
<td>Build a list of target companies</td>
<td>Build a target list from customer or competitor adjacency</td>
</tr>
<tr>
<td>Crunchbase endpoints needed</td>
<td>Organization Search → Organization Entity Lookup</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase access motion</td>
<td><strong>Basic for starter workflow</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase public price?</td>
<td>Full API price not public</td>
<td>N/A</td>
</tr>
<tr>
<td>NinjaPear endpoints needed</td>
<td>N/A</td>
<td>Customer Listing / Competitor API / Company Details</td>
</tr>
<tr>
<td>NinjaPear known credit math?</td>
<td>N/A</td>
<td><strong>1 credit/request + 2 credits/customer returned</strong> for Customer Listing</td>
</tr>
<tr>
<td>Best practical takeaway</td>
<td>Great for startup discovery by firmographic or funding filters.</td>
<td>Better when the list needs to be commercially actionable, not just broad.</td>
</tr>
</tbody>
</table>
<h3 id="investor-research">Investor research</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem</td>
<td>Research funding history and investors</td>
<td>Pull funding plus adjacent company context</td>
</tr>
<tr>
<td>Crunchbase endpoints needed</td>
<td>Org Lookup → funding cards → investor cards</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase access motion</td>
<td><strong>Full API likely for real depth</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase public price?</td>
<td><strong>Custom / sales quote required</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>NinjaPear endpoints needed</td>
<td>N/A</td>
<td>Company Funding</td>
</tr>
<tr>
<td>NinjaPear known credit math?</td>
<td>N/A</td>
<td>Partial, public page says <strong>2+ credits/call</strong></td>
</tr>
<tr>
<td>Best practical takeaway</td>
<td>Crunchbase wins this workflow.</td>
<td>Useful adjacent layer, not a full replacement.</td>
</tr>
</tbody>
</table>
<h3 id="account-research">Account research</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem</td>
<td>Prep for a meeting</td>
<td>Prep for a meeting with GTM context</td>
</tr>
<tr>
<td>Crunchbase endpoints needed</td>
<td>Autocomplete → Org Lookup</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase access motion</td>
<td>Basic can start</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase public price?</td>
<td>Full API price not public</td>
<td>N/A</td>
</tr>
<tr>
<td>NinjaPear endpoints needed</td>
<td>N/A</td>
<td>Customer Listing, Company Updates, Employee API</td>
</tr>
<tr>
<td>NinjaPear known credit math?</td>
<td>N/A</td>
<td>Partial</td>
</tr>
<tr>
<td>Best practical takeaway</td>
<td>Good baseline profile lookup.</td>
<td>Better if the rep needs what changed and why now.</td>
</tr>
</tbody>
</table>
<h3 id="watchlists-and-monitoring">Watchlists and monitoring</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem</td>
<td>Watch a set of target companies</td>
<td>Monitor meaningful company changes</td>
</tr>
<tr>
<td>Crunchbase endpoints needed</td>
<td>Repeated search / repeated lookup</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase access motion</td>
<td>Not clearly positioned as monitoring in public docs</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase public price?</td>
<td>No monitoring pricing path visible in reviewed docs</td>
<td>N/A</td>
</tr>
<tr>
<td>NinjaPear endpoints needed</td>
<td>N/A</td>
<td>Monitor API / Company Updates</td>
</tr>
<tr>
<td>NinjaPear known credit math?</td>
<td>N/A</td>
<td>Partial, plus blog scenario examples</td>
</tr>
<tr>
<td>Best practical takeaway</td>
<td>This is not Crunchbase’s strongest job from public docs.</td>
<td>Better fit.</td>
</tr>
</tbody>
</table>
<h3 id="customer-facing-products">Customer-facing products</h3>
<table>
<thead>
<tr>
<th>Field</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Problem</td>
<td>Put company data in your app</td>
<td>Put company intelligence in your app</td>
</tr>
<tr>
<td>Crunchbase endpoints needed</td>
<td>Search / Lookup / cards / licensing review</td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase access motion</td>
<td><strong>License required territory</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>Crunchbase public price?</td>
<td><strong>Custom / sales quote required</strong></td>
<td>N/A</td>
</tr>
<tr>
<td>NinjaPear endpoints needed</td>
<td>N/A</td>
<td>Depends on endpoint mix</td>
</tr>
<tr>
<td>NinjaPear known credit math?</td>
<td>N/A</td>
<td>Partial</td>
</tr>
<tr>
<td>Best practical takeaway</td>
<td>This is a rights problem as much as a data problem.</td>
<td>Better for quick prototyping, but always review terms before shipping.</td>
</tr>
</tbody>
</table>
<h3 id="a-numeric-ninjapear-example-we-can-actually-do">A numeric NinjaPear example we can actually do</h3>
<p><strong>Finding customers for 100 target vendors</strong></p>
<p>Known from public pricing:</p>
<ul>
<li>base requests: <code>100 x 1 credit = 100 credits</code></li>
<li>if average returned customers = <code>10/company</code>, returned records = <code>100 x 10 x 2 credits = 2,000 credits</code></li>
<li>total = <strong>2,100 credits</strong></li>
</ul>
<p>The <code>10/company</code> value is an assumption for illustration. It is not a measured benchmark.</p>
<h2 id="rate-limits-and-gotchas">Rate limits and gotchas</h2>
<h3 id="200-calls-per-minute">200 calls per minute</h3>
<p>Crunchbase docs say <strong>200 calls per minute</strong>.</p>
<p>That is fine for:</p>
<ul>
<li>individual lookups</li>
<li>modest enrichment jobs</li>
<li>basic search flows</li>
</ul>
<p>It gets more annoying for:</p>
<ul>
<li>large backfills</li>
<li>multi-tenant apps</li>
<li>workflows that fan out across cards and related entities</li>
</ul>
<h3 id="the-real-bottleneck-is-often-not-rpm">The real bottleneck is often not RPM</h3>
<p>Usually it is one of these:</p>
<ul>
<li>access tier limits</li>
<li>export restrictions</li>
<li>attribution restrictions</li>
<li>procurement delays</li>
</ul>
<p><strong>Most teams think they are buying rows. They are actually buying permission.</strong></p>
<h2 id="attribution-and-licensing">Attribution and licensing</h2>
<p>This is one of the highest-value parts of the whole guide.</p>
<h3 id="internal-use-is-the-safe-default">Internal use is the safe default</h3>
<p>Crunchbase says:</p>
<blockquote>
<p>“We encourage you to leverage the API for your internal business and research needs.”</p>
</blockquote>
<p>That is the safe default.</p>
<h3 id="attribution-rules-matter">Attribution rules matter</h3>
<p>Crunchbase says attribution must:</p>
<ul>
<li>include a hyperlink to Crunchbase</li>
<li>point to the entity page if the content is primarily about one entity</li>
<li>be plainly visible to the end user</li>
<li>be in close proximity to the data</li>
<li>be visible to spiders</li>
<li>not include <code>nofollow</code></li>
</ul>
<p>That is not a legal footnote. That is product behavior.</p>
<h3 id="why-this-becomes-a-product-problem">Why this becomes a product problem</h3>
<p>Attribution affects:</p>
<ul>
<li>UI layout</li>
<li>SEO behavior</li>
<li>display logic</li>
<li>distribution rights</li>
<li>how native the data feels inside your app</li>
</ul>
<h2 id="ninjapear-alternatives-by-endpoint">NinjaPear alternatives by endpoint</h2>
<p>Here is the cleanest mapping I can give without pretending the products are identical.</p>
<table>
<thead>
<tr>
<th>Crunchbase endpoint family</th>
<th>Typical job</th>
<th>NinjaPear alternative</th>
<th>Mapping type</th>
</tr>
</thead>
<tbody>
<tr>
<td>Organization Lookup</td>
<td>CRM enrichment</td>
<td>Company Details</td>
<td>Direct</td>
</tr>
<tr>
<td>Organization Search</td>
<td>Prospecting</td>
<td>Competitor API / Customer API / Company Details</td>
<td>Partial</td>
</tr>
<tr>
<td>People Lookup</td>
<td>Account research</td>
<td>Employee API / Person Profile Endpoint</td>
<td>Partial</td>
</tr>
<tr>
<td>Funding data</td>
<td>Investor research</td>
<td>Company Funding + Company Details</td>
<td>Partial</td>
</tr>
<tr>
<td>Acquisition data</td>
<td>Market change tracking</td>
<td>Company Updates / Monitor API</td>
<td>Better adjacent</td>
</tr>
<tr>
<td>Search</td>
<td>Company discovery</td>
<td>Competitor API / Customer API</td>
<td>Partial</td>
</tr>
<tr>
<td>Autocomplete</td>
<td>UI helper</td>
<td>Internal resolver on Company Details</td>
<td>Adjacent</td>
</tr>
<tr>
<td>Insights / Predictions</td>
<td>Prioritization</td>
<td>Monitor API + Updates + Claude workflows</td>
<td>Better adjacent</td>
</tr>
</tbody>
</table>
<p>Notes:</p>
<ul>
<li>be honest when the mapping is not 1:1</li>
<li>Crunchbase wins on deep private-market funding context</li>
<li>NinjaPear wins when the workflow is GTM, monitoring, customer graphing, competitor mapping, or AI-native use</li>
</ul>
<h2 id="who-should-use-what">Who should use what</h2>
<h3 id="use-crunchbase-if">Use Crunchbase if</h3>
<ul>
<li>you care most about funding and investors</li>
<li>you do private-market research</li>
<li>you are in VC, PE, corp dev, or startup strategy</li>
<li>you can live with sales-led access for full API needs</li>
</ul>
<h3 id="use-ninjapear-if">Use NinjaPear if</h3>
<ul>
<li>you need PAYG access now</li>
<li>you want to test before you commit</li>
<li>you care about customers, competitors, employees, and company updates</li>
<li>you want to work inside Claude or AI-agent tooling</li>
</ul>
<h3 id="use-both-if">Use both if</h3>
<ul>
<li>you genuinely need funding depth <strong>and</strong> GTM actionability</li>
<li>research and sales both touch the same accounts</li>
<li>one team cares about private-market graph data and another cares about timing</li>
</ul>
<h2 id="crunchbase-vs-ninjapear-scorecard">Crunchbase vs NinjaPear scorecard</h2>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Funding depth</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Crunchbase</td>
</tr>
<tr>
<td>Pricing clarity</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Self-serve access</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Customer graph</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Competitor graph</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Live updates</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>AI workflow fit</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>2.29/5</strong></td>
<td><strong>4.14/5</strong></td>
<td>NinjaPear</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Crunchbase</th>
<th>NinjaPear</th>
<th>My take</th>
</tr>
</thead>
<tbody>
<tr>
<td>Funding depth</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Crunchbase wins for investor-grade funding context.</td>
</tr>
<tr>
<td>Pricing clarity</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Full API pricing opacity is a real tax on builders.</td>
</tr>
<tr>
<td>Self-serve access</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear’s free trial + PAYG is much easier to test.</td>
</tr>
<tr>
<td>Customer graph</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear is built for this.</td>
</tr>
<tr>
<td>Competitor graph</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Same story.</td>
</tr>
<tr>
<td>Live updates</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Monitoring is not Crunchbase’s center of gravity.</td>
</tr>
<tr>
<td>AI workflow fit</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>Claude + AI-agent docs is a real advantage.</td>
</tr>
<tr>
<td>GTM usefulness</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>For pipeline work, NinjaPear is usually the better first call.</td>
</tr>
<tr>
<td>Developer friction</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Crunchbase auth is fine, access motion is the bigger issue.</td>
</tr>
</tbody>
</table>
<p><strong>Average score:</strong> Crunchbase <strong>2.44/5</strong>, NinjaPear <strong>4.11/5</strong>.</p>
<h2 id="final-verdict">Final verdict</h2>
<p><strong>Use Crunchbase when funding data is the job. Use NinjaPear when GTM intelligence is the job. Use both only if you genuinely need both layers.</strong></p>
<p>If I were evaluating the <strong>Crunchbase API</strong> from scratch in 2026, I would do it in this order:</p>
<ol>
<li>test whether Basic’s 3 endpoints already cover the workflow</li>
<li>confirm whether the real job is funding research or GTM actionability</li>
<li>if it is funding, keep pushing on Crunchbase</li>
<li>if it is GTM, monitoring, customer graphs, competitor graphs, or AI-native workflows, test NinjaPear first because the feedback loop is shorter</li>
</ol>
<p>And if you want the practical version, not another API explainer, clone the repo and start with the scripts. That will tell you more in an hour than most comparison pages will tell you in a week.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Website Lookup Endpoint (+ Decision Maker Data in Company Details!) ]]></title>
        <description><![CDATA[ Website Lookup Endpoint

I&#39;m happy to introduce a new Website Lookup Endpoint, which takes a company name and returns its website. We also know that there are companies which are similarly named, so you can further refine the search with a hint and a country to find the ]]></description>
        <link>https://nubela.co/blog/introducing-website-lookup-endpoint/</link>
        <guid isPermaLink="false">69ef0abf0cfe430001d29d74</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 27 Apr 2026 15:10:02 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/company_website.png" medium="image"/>
        <content:encoded><![CDATA[ <h2 id="website-lookup-endpoint">Website Lookup Endpoint</h2><p>I'm happy to introduce a new <a href="https://nubela.co/docs/?ref=nubela.co#website-lookup-endpoint">Website Lookup Endpoint</a>, which takes a company name and returns its website. We also know that there are companies which are similarly named, so you can further refine the search with a <code>hint</code> and a <code>country</code> to find the right company.</p>
<p>We believe this new API endpoint will help some of you build a canonical ID for your prospects via the company's website—the same ID that we use to identify businesses.</p>
<p>The Website Lookup Endpoint costs <code>1</code> credit per lookup. Based on our testing, it returns a result nearly 100% of the time (as long as the company's website exists) in 2-3s per query on average.</p>
<h2 id="executive-data-in-company-details-endpoint">Executive Data in Company Details Endpoint</h2>
<p>I am also happy to share that you can finally get Executive Officers (aka decision makers) whenever you make a <a href="https://nubela.co/docs?ref=nubela.co#company-details-endpoint">Company Details API Endpoint</a> call. This is what it looks like for Stripe:</p>
<pre><code class="language-json">{
  "addresses": [
    {
      "address_type": "HEADQUARTERS",
      "city": "South San Francisco",
      "country": "United States",
      "country_code": "US",
      "is_primary": true,
      "line1": "354 Oyster Point Boulevard",
      "line2": null,
      "postal_code": "94080",
      "state": "CA"
    }
  ],
  "company_type": "PRIVATELY_HELD",
  "cover_pic_url": "https://images.stripeassets.com/fzn2n1nzq965/XtX984S1GJVsVOXFC7kMu/01988281e867728dfb09aa7793a6e3b9/Stripe.jpg?q=80",
  "description": "Stripe is a financial services platform that helps businesses accept payments, build flexible billing models, and manage money movement.",
  "employee_count": 8259,
  "executives": [
    {
      "name": "Patrick Collison",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Patrick&amp;last_name=Collison",
      "role": "CEO",
      "title": "Co-founder and CEO"
    },
    {
      "name": "John Collison",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=John&amp;last_name=Collison",
      "role": "PRESIDENT",
      "title": "Co-founder and President"
    },
    {
      "name": "Will Gaybrick",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Will&amp;last_name=Gaybrick",
      "role": "PRESIDENT",
      "title": "President, Technology and Business"
    },
    {
      "name": "Steffan Tomlinson",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Steffan&amp;last_name=Tomlinson",
      "role": "CFO",
      "title": "Chief Financial Officer"
    },
    {
      "name": "David Singleton",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=David&amp;last_name=Singleton",
      "role": "CTO",
      "title": "Chief Technology Officer"
    },
    {
      "name": "Jeff Titterton",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Jeff&amp;last_name=Titterton",
      "role": "CMO",
      "title": "Chief Marketing Officer"
    },
    {
      "name": "Eileen O'Mara",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Eileen&amp;last_name=O%27Mara",
      "role": "OTHER",
      "title": "Chief Revenue Officer"
    },
    {
      "name": "Trish Walsh",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Trish&amp;last_name=Walsh",
      "role": "OTHER",
      "title": "General Counsel"
    },
    {
      "name": "Rob McIntosh",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Rob&amp;last_name=McIntosh",
      "role": "OTHER",
      "title": "Chief People Officer"
    },
    {
      "name": "William Alvarado",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=William&amp;last_name=Alvarado",
      "role": "OTHER",
      "title": "Chief Business Officer"
    },
    {
      "name": "James Phillips",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=James&amp;last_name=Phillips",
      "role": "DIRECTOR",
      "title": "Director of Financial Services"
    },
    {
      "name": "Christa Davies",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Christa&amp;last_name=Davies",
      "role": "BOARD_MEMBER",
      "title": "Lead Independent Director"
    },
    {
      "name": "Bill Winters",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Bill&amp;last_name=Winters",
      "role": "BOARD_MEMBER",
      "title": "Independent Director"
    },
    {
      "name": "Luciana Lixandru",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Luciana&amp;last_name=Lixandru",
      "role": "BOARD_MEMBER",
      "title": "Independent Director"
    },
    {
      "name": "Matthew Huang",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Matthew&amp;last_name=Huang",
      "role": "BOARD_MEMBER",
      "title": "Independent Director"
    },
    {
      "name": "Claire Hughes Johnson",
      "person_profile_url": "https://nubela.co/api/v1/employee/profile?employer_website=https%3A%2F%2Fstripe.com&amp;first_name=Claire&amp;last_name=Johnson",
      "role": "BOARD_MEMBER",
      "title": "Board Member"
    }
  ],
  "facebook_url": "https://facebook.com/StripeHQ",
  "founded_year": 2010,
  "funding": "https://nubela.co/api/v1/company/funding?website=https%3A%2F%2Fstripe.com",
  "industry": 45103010,
  "instagram_url": "https://instagram.com/stripehq",
  "logo_url": "https://nubela.co/api/v1/company/logo?website=https://stripe.com",
  "name": "Stripe",
  "public_listing": null,
  "similar_companies": "https://nubela.co/api/v1/competitor/listing?website=https%3A%2F%2Fstripe.com",
  "specialties": [
    "Payments",
    "Billing",
    "Financial Services",
    "Revenue Management",
    "Embedded Finance"
  ],
  "tagline": "Financial Infrastructure to Grow Your Revenue",
  "twitter_url": "https://x.com/stripe",
  "updates": "https://nubela.co/api/v1/company/updates?website=https%3A%2F%2Fstripe.com",
  "website": "https://stripe.com",
  "websites": [
    "https://stripe.com"
  ]
}
</code></pre>
<p>Company details that are fully packed! :) This data costs more to procure, so we have incremented the cost of the Company Profile Endpoint from <code>2</code> base credits to <code>3</code> base credits per API call.</p>
<h2 id="keep-the-feedback-coming">Keep the feedback coming!</h2>
<p>Most of these changes came about because you guys email me or reply to my emails. Please keep them coming and you'll see positive changes happening for you.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Work Email Data (+ other QOL improvements) ]]></title>
        <description><![CDATA[ I am happy to introduce to you today a new NinjaPear API Endpoint—the Work Email Endpoint. The Work Email Endpoint takes in a person&#39;s name and the company where they work, for which a work email is returned on a best-effort basis.


This API Endpoint takes special ]]></description>
        <link>https://nubela.co/blog/introducing-work-email/</link>
        <guid isPermaLink="false">69e87e7f0cfe430001d29d45</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 22 Apr 2026 15:57:02 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/workemail.png" medium="image"/>
        <content:encoded><![CDATA[ <p>I am happy to introduce to you today a new NinjaPear API Endpoint—the <a href="https://nubela.co/docs?ref=nubela.co#work-email-endpoint">Work Email Endpoint</a>. The Work Email Endpoint takes in a person's name and the company where they work, for which a work email is returned on a best-effort basis.</p>
<p>This API Endpoint takes special care not to read from private or proprietary datasets, and only from public sources, while doing its best to return a valid work email address. We do so as not to violate privacy laws or breach the Terms of Use or User Agreement of any sites.</p>
<p>That said, let me put it out there first: there are better contact enrichment services out there. But read on to find out the narrow use cases for which you should use NinjaPear's.</p>
<h2 id="how-well-does-it-work">How well does it work?</h2>
<p>To give you a transparent look at what to expect, we ran a fulfillment test across 20 diverse profiles. Our goal wasn't just to see if the API returns data, but to see how it handles real-world scenarios, including obscure domains and legacy companies.</p>
<h3 id="performance-summary">Performance Summary</h3>
<ul>
<li><strong>Fulfillment Rate:</strong> 65% (13/20)</li>
<li><strong>Reliability:</strong> 100% (All 20 calls returned HTTP 200; no technical errors)</li>
<li><strong>Average Latency:</strong> ~9.3 seconds</li>
</ul>
<h3 id="fulfillment-test-results-n20">Fulfillment Test Results (n=20)</h3>
<table>
<thead>
<tr>
<th><strong>#</strong></th>
<th><strong>Name</strong></th>
<th><strong>Domain</strong></th>
<th><strong>Result</strong></th>
<th><strong>Latency</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Matt Aitken</td>
<td>residencesontheavenue.com</td>
<td>MISS</td>
<td>10.0 s</td>
</tr>
<tr>
<td>2</td>
<td>Christian Floisand</td>
<td>helcim.com</td>
<td><code>c********@helcim.com</code></td>
<td>10.6 s</td>
</tr>
<tr>
<td>3</td>
<td>Michael Komosinski</td>
<td>amplify.com</td>
<td><code>m**********@amplify.com</code></td>
<td>11.2 s</td>
</tr>
<tr>
<td>4</td>
<td>Pradeep Baliga</td>
<td>paypal.com</td>
<td><code>p******@paypal.com</code></td>
<td>8.7 s</td>
</tr>
<tr>
<td>5</td>
<td>Chuck Anthony</td>
<td>silverbullet.ac</td>
<td>MISS</td>
<td>8.6 s</td>
</tr>
<tr>
<td>6</td>
<td>Ryan Huber</td>
<td>defined.net</td>
<td><code>r***@defined.net</code></td>
<td>10.8 s</td>
</tr>
<tr>
<td>7</td>
<td>Pieter van der Does</td>
<td>adyen.com</td>
<td><code>p**********@adyen.com</code></td>
<td>8.6 s</td>
</tr>
<tr>
<td>8</td>
<td>Ravi Hubbly</td>
<td>exploredigits.com</td>
<td><code>r*******@exploredigits.com</code></td>
<td>8.8 s</td>
</tr>
<tr>
<td>9</td>
<td>Mihai Chiorean</td>
<td>cash.app</td>
<td><code>m********@cash.app</code></td>
<td>11.6 s</td>
</tr>
<tr>
<td>10</td>
<td>Dave Wiskus</td>
<td>standard.com</td>
<td>MISS</td>
<td>11.3 s</td>
</tr>
<tr>
<td>11</td>
<td>Robert Bollinger</td>
<td>robertbollinger.com</td>
<td><code>r*****@robertbollinger.com</code></td>
<td>9.0 s</td>
</tr>
<tr>
<td>12</td>
<td>Mark Frohnmayer</td>
<td>badhabit.com</td>
<td>MISS</td>
<td>7.8 s</td>
</tr>
<tr>
<td>13</td>
<td>Sergio Buniac</td>
<td>boozallen.com</td>
<td>MISS</td>
<td>8.9 s</td>
</tr>
<tr>
<td>14</td>
<td>Mo Hessabi</td>
<td>metrostar.com</td>
<td><code>m*******@metrostar.com</code></td>
<td>9.7 s</td>
</tr>
<tr>
<td>15</td>
<td>Steven Goh</td>
<td>nubela.co</td>
<td><code>s*****@nubela.co</code></td>
<td>0.3 s (Cache)</td>
</tr>
<tr>
<td>16</td>
<td>Tim Beard</td>
<td>silverbullet.md</td>
<td>MISS</td>
<td>12.2 s</td>
</tr>
<tr>
<td>17</td>
<td>Lucas Salisbury</td>
<td>fastspring.com</td>
<td><code>l*********@fastspring.com</code></td>
<td>9.0 s</td>
</tr>
<tr>
<td>18</td>
<td>Charles Cao</td>
<td>ibm.com</td>
<td><code>c**********@ibm.com</code></td>
<td>9.7 s</td>
</tr>
<tr>
<td>19</td>
<td>Ignacio Llorente</td>
<td>sun.com</td>
<td>MISS</td>
<td>9.5 s</td>
</tr>
<tr>
<td>20</td>
<td>David Nachman</td>
<td>fastspring.com</td>
<td><code>d*******@fastspring.com</code></td>
<td>9.5 s</td>
</tr>
</tbody>
</table>
<h2 id="there-are-other-better-tools-out-there-for-contact-enrichment">There are other, better tools out there for contact enrichment</h2>
<p>I'm going to be honest: Apollo or Clay will be infinitely better contact enrichment tools. NinjaPear isn't trying to be a contact enrichment product. We built the Work Email Endpoint simply because it is convenient for our users, and for those who want contact data strictly via public sources and not fished out from Chrome Extensions hooking into private Gmail accounts, like what Clearbit used to do.</p>
<p>In other words, use the Work Email Endpoint only if you do not already have access to better enrichment tools and you want 100% kosher contact data so that when a contact asks how you got their email, you can confidently say:</p>
<blockquote>
<p>Hey, I found your email on the public web. You had either posted it somewhere in cleartext or your company has a known email pattern.</p>
</blockquote>
<p>That said, honest to goodness: I built this because we are building out our AI agentic outbound sales / cold email pipeline and this was a missing piece. In fact, if you see our Competitors Listing Endpoint and Similar People Endpoint, you can see how we are gradually building out our own prospecting capabilities for our agentic pipelines ;)</p>
<h2 id="how-much-does-the-work-email-endpoint-cost">How much does the Work Email Endpoint cost?</h2>
<p>It costs <code>2</code> credits on a successful lookup—whenever we actually return something useful—and <code>0.5</code> credits if we return nothing. We charge a token amount to prevent denial-of-service attacks and also to cover our costs because we are performing live scraping and LLM calls on every API call. (See, we do not read from a contact database like the other guys).</p>
<h2 id="look-up-companies-by-name-instead-of-website">Look up companies by name instead of website</h2>
<p>A lot of customers have reached out asking if they can use a company name because they do not have the company website to perform various API calls. Well, as of today, yes you can!</p>
<p>For most API endpoints that take a company website, you can now provide a company name instead, whereby we will automagically look up the company's website. However, we still very much prefer that you use a website instead simply because it is more precise. There are many companies with the same or similar names globally, and NinjaPear works worldwide!</p>
<p>These are the API endpoints that now accept company names instead of a company website input:</p>
<ul>
<li><a href="https://nubela.co/docs?ref=nubela.co#customer-listing-endpoint">Customer Listing Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#competitor-listing-endpoint">Competitor Listing Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#company-details-endpoint">Company Details Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#employee-count-endpoint">Employee Count Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#company-updates-endpoint">Company Updates Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#company-funding-endpoint">Company Funding Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#person-profile-endpoint">Person Profile Endpoint</a></li>
<li><a href="https://nubela.co/docs?ref=nubela.co#similar-people-endpoint">Similar People Endpoint</a></li>
</ul>
<h2 id="what-is-on-the-horizon">What is on the horizon</h2>
<p>We have recently started mapping every damn product and service of all businesses worldwide into a giant database that you can look up. In other words, I want you to know that product data is coming soon, amongst others. I will keep you posted. I'm excited about this.</p>
<p>Because just think about it: short of a Google search and doing it manually, how can you find a "CRM that has OAuth and Gmail integration, with PAYG options" instantly? There exists AI deep research which will send an agent to make a web search and trawl the sites, but it will still only perform a top <code>N</code> SERP result crawl and not go deeper. I'm excited about this!</p>
<p>On top of that, there is something we're doing on the B2C front that will be a multi-year endeavor. I'll keep you posted on this too.</p>
<p>Questions? Send us an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Is Scraping LinkedIn Legal in 2026? (I Was Sued by LinkedIn) ]]></title>
        <description><![CDATA[ If you&#39;re asking is scraping LinkedIn legal in 2026, here&#39;s the short answer: public scraping is not automatically criminal after hiQ, but building a business on LinkedIn data is still not safe. Those are different statements. I learned that the expensive way. I was sued by ]]></description>
        <link>https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/</link>
        <guid isPermaLink="false">69e198be44d9df00016fef87</guid>
        <category><![CDATA[ is scraping linkedin legal ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 17 Apr 2026 10:19:42 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_11-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you're asking <strong>is scraping LinkedIn legal in 2026</strong>, here's the short answer: <strong>public scraping is not automatically criminal after <em>hiQ</em>, but building a business on LinkedIn data is still not safe</strong>. Those are different statements. I learned that the expensive way. I was sued by LinkedIn. Proxycurl and I have since settled.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Protoclown98</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Just because it is legal doesn't mean that LinkedIn won't have any recourse. The TOS are a contract and if they can prove damages because Apollo and Seamless violated that contract they may have a claim against them.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/comments/1j5uyjm/apollo_and_seamless_booted_from_linkedin/mgli843/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That commenter got to the point faster than most lawyers do. That is the whole article.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: LinkedIn Data Risk Checklist for Founders and Buyers</strong><br>
<span style="color:#555;">A practical audit checklist for browser extensions, vendors, databases, model training, backups, and customer exposure.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/linkedin-data-risk-checklist-3e3b074c.pdf?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="tldr">TL;DR</h2>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Public scraping after <em>hiQ</em></th>
<th>Buying from a broker</th>
<th>Building on LinkedIn-derived data</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Criminal exposure</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Tie</td>
</tr>
<tr>
<td>Contract safety</td>
<td>⭐☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>None</td>
</tr>
<tr>
<td>Civil lawsuit risk</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>Public scraping, narrowly</td>
</tr>
<tr>
<td>Business durability</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>None</td>
</tr>
<tr>
<td>Discovery survivability</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>Barely public scraping</td>
</tr>
<tr>
<td>Long-term founder sanity</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>None</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>1.86/5</strong></td>
<td><strong>1.14/5</strong></td>
<td><strong>0.71/5</strong></td>
<td><strong>Do not build here</strong></td>
</tr>
</tbody>
</table>
<p>My actual answer to <strong>is scraping LinkedIn legal in 2026</strong> is this:</p>
<ul>
<li><strong>Narrow legal answer</strong>: scraping public LinkedIn pages is not automatically criminal under the CFAA after <em>hiQ</em>.</li>
<li><strong>Useful operator answer</strong>: LinkedIn data is still not safe to build on.</li>
<li><strong>Buyer answer</strong>: buying it from a vendor does not clean the chain of custody.</li>
<li><strong>Founder answer</strong>: the lawsuit risk is not the only problem. Discovery, customer notice, data deletion, and code deletion are the real problem.</li>
</ul>
<h2 id="why-im-writing-this">Why I'm writing this</h2>
<p>I was a named defendant in <em>LinkedIn Corporation v. Nubela Pte. Ltd., Proxycurl LLC, Steven Goh, and Bach Le</em>, filed in the Northern District of California on January 24, 2025, Case No. 3:25-cv-00828.</p>
<p>Proxycurl and I have settled with LinkedIn. I am not going to relitigate the case here. I am also not going to discuss settlement terms beyond that sentence.</p>
<p>What I can do is correct a mistake in how people used my earlier writing.</p>
<p>Back in 2019, I wrote a post called <em>Is LinkedIn Scraping Legal?</em> on the Nubela blog. That post made a narrow legal point about the CFAA and public data. I still think the narrow point was correct. The broader conclusion many people took from it, that LinkedIn data was therefore safe to build on, was not correct.</p>
<p>That distinction matters more in 2026 than it did in 2019.</p>
<p>The reason is simple. Once you are the defendant, the question changes. It stops being "can I win an internet argument about public data" and becomes "what can this plaintiff do to my company before the merits even matter".</p>
<p>That is a different question. It has a different answer.</p>
<h2 id="legal-does-not-mean-safe">Legal does not mean safe</h2>
<p>People like the question <strong>is scraping LinkedIn legal</strong> because it sounds binary.</p>
<p>It is not binary.</p>
<p>At a minimum, you need four buckets:</p>
<ol>
<li><strong>Criminal law</strong>: can the government prosecute you?</li>
<li><strong>Civil statutory claims</strong>: can a private plaintiff sue you under a statute like the CFAA, 18 U.S.C. § 1030(g)?</li>
<li><strong>Contract claims</strong>: did you agree to terms and then violate them?</li>
<li><strong>Other civil claims</strong>: unfair competition, misappropriation, trademark, fraud, and whatever else a plaintiff decides to stack in.</li>
</ol>
<p>The case people keep citing is <em>hiQ Labs, Inc. v. LinkedIn Corp.</em>, 31 F.4th 1180 (9th Cir. 2022).</p>
<p>What <em>hiQ</em> actually did was narrower than the folklore around it. It helped on the specific CFAA question around scraping public LinkedIn pages. It did <strong>not</strong> hold that scraping LinkedIn is generally safe. It did <strong>not</strong> erase contract claims. It did <strong>not</strong> erase California state-law claims. It did <strong>not</strong> tell buyers of LinkedIn-derived data that they were fine.</p>
<p>This is the part I underestimated for too long.</p>
<p>My 2019 post literally said: <strong>"You'd still have to be compliant with websites' ToS."</strong> That caveat was doing more work than the headline.</p>
<p>Readers remembered the headline. They forgot the caveat. I probably helped that happen.</p>
<p>So if you want the answer in plain English, here it is: <strong>public scraping may be outside one narrow theory of criminal or statutory liability, but that does not make your company safe from LinkedIn</strong>.</p>
<p>That is the frame I wish I had pushed harder from the start.</p>
<h2 id="the-user-agreement-catches-almost-everyone">The User Agreement catches almost everyone</h2>
<p>If you do anything in B2B data, this is the part you should read twice.</p>
<p>Most people talk about "public data" like it ends the discussion. It does not. The contract is where the danger lives.</p>
<p>LinkedIn's complaint said LinkedIn had more than one billion members at the time. If you have a LinkedIn account, had one in the past, or administer a LinkedIn Company Page, there is a good chance you are in contract land already.</p>
<p>And courts enforce click-through contracts all the time. This is not exotic law.</p>
<h3 id="the-scraping-clause-is-not-the-only-clause">The scraping clause is not the only clause</h3>
<p>Most people know there is a scraping clause in LinkedIn's User Agreement.</p>
<p>Section 8.2(2) says you cannot:</p>
<blockquote>
<p>"Develop, support or use software, devices, scripts, robots or any other means or processes (such as crawlers, browser plugins and add-ons or any other technology) to scrape or copy the Services..."</p>
</blockquote>
<p>Fine. Everyone expects that.</p>
<p>The clause more buyers should care about is Section 8.2(4):</p>
<blockquote>
<p>"Copy, use, display or distribute any information (including content) obtained from the Services, whether directly or through third parties (such as search tools or data aggregators or brokers), without the consent of the content owner..."</p>
</blockquote>
<p>That language matters. Especially the phrase <strong>"whether directly or through third parties ... data aggregators or brokers"</strong>.</p>
<p>If you are a LinkedIn member and you buy a CSV, enrichment feed, or vendor dataset that contains LinkedIn-derived data, LinkedIn has a contract clause written for that fact pattern.</p>
<p>The data being public does not solve that.</p>
<p>The vendor being a respected vendor does not solve that.</p>
<p>The vendor being outside the US does not solve that.</p>
<p>There are two more clauses worth reading.</p>
<p>Section 8.2(11):</p>
<blockquote>
<p>"Rent, lease, loan, trade, sell/re-sell or otherwise monetize the Services or related data or access to the same, without LinkedIn's consent."</p>
</blockquote>
<p>Section 8.2(13):</p>
<blockquote>
<p>"Use bots or other unauthorized automated methods to access the Services..."</p>
</blockquote>
<p>This is not a narrow anti-scraping rule. It is a broad contractual perimeter.</p>
<h3 id="company-pages-pull-companies-in-too">Company Pages pull companies in too</h3>
<p>A lot of founders forget this part.</p>
<p>If your company has a LinkedIn Page, the company did not just make a marketing asset. It clicked into a contract too.</p>
<p>LinkedIn's complaint walked through Nubela's and Proxycurl's Company Pages, and pointed out that creating those pages required agreement to LinkedIn's terms. The complaint also used forum-selection language to bring a Singaporean company and a Wyoming LLC into the Northern District of California.</p>
<p>This feels administrative until it doesn't.</p>
<p>Then it is jurisdiction.</p>
<h3 id="deleting-your-account-does-not-make-this-go-away">Deleting your account does not make this go away</h3>
<p>This is the part that usually gets silence.</p>
<p>Section 5 of LinkedIn's User Agreement contains a survival clause. It says sections including <strong>6 and 8.2</strong> survive termination.</p>
<p>Section 8.2 is the whole block that contains the scraping clause, the third-party broker clause, the resale clause, and the bots clause.</p>
<p>Section 6 is the dispute-resolution and governing-law machinery.</p>
<p>So no, you do not get to close your account and pretend the contract never happened.</p>
<p>The restrictions that matter here can outlive the account.</p>
<h3 id="the-practical-consequence">The practical consequence</h3>
<p>If you are, or ever were, a LinkedIn member or a Page administrator, and you buy, use, resell, or build on LinkedIn-derived data, LinkedIn has a plausible breach-of-contract story against you.</p>
<p>I am being careful with that wording.</p>
<p>I am not saying every such case wins.</p>
<p>I am saying this is not a posture I would build a business on anymore.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/m_c__a_t</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I got logged out of my account and LinkedIn gave me a warning that they detected automation software and I could get banned if it continues. It’s annoying because I wasn’t automating anything but I did delete the Apollo extension asap</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/comments/1j6tuj8/with_the_linkedin_crackdown_on_apollo_seamless/mgvbyhg/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is not a court opinion. It is still useful. It tells you how people experience the lower rungs of enforcement.</p>
<h2 id="what-the-complaint-actually-said">What the complaint actually said</h2>
<p>There is a point where abstract debate stops being useful.</p>
<p>Reading a complaint with your own name in it will do that.</p>
<h3 id="six-claims-at-once">Six claims at once</h3>
<p>LinkedIn's complaint stacked six claims:</p>
<ol>
<li><strong>Breach of contract</strong></li>
<li><strong>Fraud and deceit</strong> under California Civil Code §§ 1572 and 1710</li>
<li><strong>Computer Fraud and Abuse Act</strong></li>
<li><strong>California Unfair Competition Law</strong> under Bus. &amp; Prof. Code § 17200</li>
<li><strong>Trademark dilution by tarnishment</strong> under the Lanham Act</li>
<li><strong>Misappropriation</strong></li>
</ol>
<p>This matters for a boring reason.</p>
<p>Even if you think two or three of those are weak, you still have to live with the rest while the case runs.</p>
<p>You do not need to lose every issue for the process to become punishing.</p>
<h3 id="they-quoted-my-own-writing-back-at-me">They quoted my own writing back at me</h3>
<p>This was probably the cleanest lesson in the whole case.</p>
<p>LinkedIn quoted my own blog post back at me.</p>
<p>Complaint paragraph 60 quoted my old warning that scraping in disregard of terms of service is where things become tricky.</p>
<p>Complaint paragraph 61 quoted my old point that fake accounts used to access otherwise inaccessible data are obvious trouble.</p>
<p>It also quoted: <strong>"Clearly fraudulent activities are a big no-no in web scraping."</strong></p>
<p>I wrote those lines as caveats. Litigation turned them into admissions.</p>
<p>That is not unfair. That is just how this works.</p>
<p>If you run a data business and you write publicly about legal boundaries, assume every sentence may come back later in a pleading.</p>
<p>Because it might.</p>
<h3 id="the-scary-part-was-the-remedy">The scary part was the remedy</h3>
<p>The part founders should study is not the headline of the complaint. It is the prayer for relief.</p>
<p>Complaint paragraph 121 asked for an order requiring destruction of not just the allegedly scraped LinkedIn data, but also any data that was:</p>
<blockquote>
<p>"inferred, aggregated, or synthesized as a result of data wrongfully extracted and copied from LinkedIn's website"</p>
</blockquote>
<p>Paragraph 122 asked for destruction of software code and other tools for scraping LinkedIn.</p>
<p>Paragraph 123 asked for customer notification.</p>
<p>That is the piece people skip past too quickly.</p>
<p>If a plaintiff asks for raw data deletion, that is one thing.</p>
<p>If the plaintiff asks for deletion of <strong>downstream inferred and aggregated data</strong>, that is much worse. Now you are talking about feature stores, model training sets, enrichment outputs, derivative fields, and internal systems built on top of disputed source data.</p>
<p>If you trained a model on LinkedIn-derived data, you do not get to wave your hands and say the weights are spiritually separate from the input.</p>
<p>Maybe you win that argument eventually. Good luck enjoying the trip there.</p>
<h2 id="discovery-is-the-punishment">Discovery is the punishment</h2>
<p>This is the part non-lawyers tend to underweight.</p>
<p>The complaint is the public event. Discovery is the expensive event.</p>
<h3 id="every-claim-opens-another-door">Every claim opens another door</h3>
<p>Each claim creates another set of things the plaintiff can ask about.</p>
<p>Breach of contract means account creation, acceptance of terms, internal knowledge, use of tools, and downstream use.</p>
<p>CFAA means access patterns, infrastructure, logs, credentials, proxies, and notice.</p>
<p>Trademark means marketing copy, sales collateral, web pages, browser extensions, screenshots, and customer messaging.</p>
<p>Unfair competition and misappropriation can widen everything.</p>
<p>One case becomes several overlapping excavations into how your company actually runs.</p>
<h3 id="what-gets-opened-up">What gets opened up</h3>
<p>If you have never been through discovery, here is the operator version.</p>
<p>Potentially relevant material can include:</p>
<ul>
<li>email hits for terms like <code>linkedin</code>, <code>scrape</code>, <code>extension</code>, <code>proxy</code>, <code>captcha</code>, <code>sales nav</code></li>
<li>Slack messages and DMs</li>
<li>Git history</li>
<li>Jira tickets</li>
<li>CI logs</li>
<li>database schemas</li>
<li>old backups</li>
<li>proxy vendor contracts</li>
<li>CAPTCHA solver invoices</li>
<li>customer contracts tied to the data</li>
<li>internal docs discussing data provenance</li>
<li>browser extension prototypes</li>
<li>prior entities and side projects run by founders</li>
</ul>
<p>This is what I mean when I say <strong>legal does not mean safe</strong>.</p>
<p>You can have a clever merits argument and still be in a terrible business position.</p>
<h3 id="the-asymmetry-is-built-in">The asymmetry is built in</h3>
<p>LinkedIn's complaint was signed by Munger, Tolles &amp; Olson.</p>
<p>That matters.</p>
<p>Large plaintiffs can fund long litigation campaigns. Startups generally cannot. Even profitable ones feel it.</p>
<p>This is not a morality tale. It is arithmetic.</p>
<p>Fight, settle, or default. Those are all bad doors.</p>
<p>The time to decide is before the data enters the building.</p>
<h3 id="buyers-are-not-bystanders">Buyers are not bystanders</h3>
<p>A lot of buyers still think the vendor absorbs all the risk.</p>
<p>No.</p>
<p>If LinkedIn sues your vendor, you can get subpoenaed. Your diligence file matters. Your procurement emails matter. Your Slack jokes matter. Your model input docs matter.</p>
<p>If your internal posture was basically "we know where this probably came from but let's not ask too many questions", that is not a good position to discover later.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/n8n</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Jaded_Marionberry771</span>
<span style="color:#878a8c;">· ▲ ?</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">You will get banned, all your accounts, if you continue to bypass, there will be threat of legal action. it’s not sustainable buisness model.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/n8n/comments/1qdt3si/linked_in_scraping_legal_situation/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>The grammar is rough. The business point is not.</p>
<h2 id="apollo-and-seamless-were-the-warning-shot">Apollo and Seamless were the warning shot</h2>
<p>Not every enforcement step starts with a complaint.</p>
<p>That matters.</p>
<p>Public reporting in 2025 noted that Apollo.io and Seamless.ai had their LinkedIn Company Pages removed. LeadGenius and LiGo both wrote about it as part of a broader crackdown on LinkedIn-adjacent scraping and extension behavior.</p>
<p>I am being careful here. I am sticking to the public reporting and the visible fact pattern.</p>
<p>The useful point is not some definitive claim about their internal conduct. The useful point is that LinkedIn showed it can act unilaterally, publicly, and before any public lawsuit appears.</p>
<p>That means there is an enforcement ladder.</p>
<p>My rough version of the ladder looks like this:</p>
<ol>
<li>account restrictions</li>
<li>automation warnings</li>
<li>Company Page removals</li>
<li>cease-and-desist letters</li>
<li>federal complaint</li>
</ol>
<p>The point is not that every company will climb every rung in order.</p>
<p>The point is that these rungs are real. We have seen them in the wild.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/FreshPrince2308</span>
<span style="color:#878a8c;">· ▲ 18</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Apollo &amp; Seamless had their entire company pages deleted from Linkedin yesterday for violating their terms of service by scraping data

Edit: Idk if this part is true but their competition is saying users that continue to use these tools’ extensions on Linkedin are risk to get banned from Linkedin.

Again - the competition is saying this - not saying it’s true</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/comments/1j6tuj8/with_the_linkedin_crackdown_on_apollo_seamless/mgryop2/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is useful because it shows market perception in real time. People saw the page removals and immediately started asking a more serious question than "is scraping legal". They started asking what happens to users, extensions, and account risk.</p>
<p>That is the right direction.</p>
<p>There is also a practical point here for operators. If your product depends on goodwill from a platform you are contractually at odds with, that dependency is fragile even before a judge touches the case.</p>
<h2 id="the-only-safe-path-i-trust-now">The only safe path I trust now</h2>
<p>This is where I changed my mind.</p>
<p>If you are building, using, or scaling with B2B data, I think the only durable answer is this:</p>
<p><strong>Use data that does not have LinkedIn as a source.</strong></p>
<p>Not "mostly not".</p>
<p>Not "we only enrich with it".</p>
<p>Not "we bought it rather than scraped it".</p>
<p>Not "we deleted it later".</p>
<p>None of that is clean enough.</p>
<h3 id="what-zero-linkedin-data-actually-means">What zero LinkedIn data actually means</h3>
<p>When I say zero LinkedIn data, I mean something strict enough to survive diligence and strict enough to survive discovery.</p>
<p>That means:</p>
<ul>
<li>no LinkedIn-sourced rows in prod, staging, notebooks, or dev databases</li>
<li>no LinkedIn URLs, member IDs, or copied fields in code paths</li>
<li>no LinkedIn content in training sets, evals, prompt corpora, or fine-tunes</li>
<li>no vendor whose vendor touched LinkedIn</li>
<li>no Chrome extensions touching <code>linkedin.com</code></li>
<li>no internal prototypes that hit LinkedIn and then got "deleted"</li>
<li>no reachable Git blobs containing LinkedIn-specific scraping code</li>
<li>no forgotten S3 backups with stale data dumps</li>
</ul>
<p>This sounds severe.</p>
<p>It is severe.</p>
<p>That is because discovery is severe.</p>
<p>If you want to be able to say under oath that LinkedIn data was never part of the product, then that needs to be true in a boring, literal, systems-engineering sense.</p>
<p>Not in a vibes sense.</p>
<h3 id="why-im-building-ninjapear-this-way">Why I'm building NinjaPear this way</h3>
<p>This is one reason I am building NinjaPear with a zero-LinkedIn-data posture.</p>
<p>The point is not that I suddenly stopped caring about B2B data. I care about it more than ever.</p>
<p>The point is that I no longer think LinkedIn is a durable substrate for a company.</p>
<p>That is why products like the <a href="https://nubela.co/companies?ref=nubela.co">Customer API</a>, <a href="https://nubela.co/company-monitor?ref=nubela.co">Company Monitor</a>, and <a href="https://nubela.co/pricing?ref=nubela.co">Pricing</a> sit on a different posture entirely. The data model has to work without LinkedIn in ingestion, training, enrichment, or internal tooling.</p>
<p>This is not me trying to sneak in a sales pitch.</p>
<p>It is the conclusion the lawsuit forced me to take seriously.</p>
<p>I spent years arguing about legal boundaries. I now care more about whether a company can still exist in 10 years without carrying this particular exposure around.</p>
<p>For me, that answer requires a clean break.</p>
<h3 id="why-i-do-not-keep-a-linkedin-profile-anymore">Why I do not keep a LinkedIn profile anymore</h3>
<p>I want to be explicit here because people misread this.</p>
<p>Neither NinjaPear nor I maintain a LinkedIn profile now. No member account. No Company Page. No Showcase Page.</p>
<p>The reason is <strong>not</strong> that we want to scrape LinkedIn. We do not. We will not.</p>
<p>The reason is that if the User Agreement is broad, and its relevant restrictions survive termination, then the lowest-exposure posture is simply not to be a party to that contract anymore.</p>
<p>Some readers will think that is too strict.</p>
<p>Fair enough.</p>
<p>After being named in a complaint, strictness started looking cheaper.</p>
<h2 id="my-actual-answer">My actual answer</h2>
<p>So, one more time, <strong>is scraping LinkedIn legal in 2026</strong>?</p>
<p>My answer is:</p>
<ul>
<li>If you mean <strong>criminally illegal under the CFAA</strong>, public scraping is not automatically illegal after <em>hiQ</em>.</li>
<li>If you mean <strong>safe to build a business on</strong>, no, I do not think it is safe.</li>
<li>If you mean <strong>safe because a vendor sold it to you</strong>, also no.</li>
<li>If you mean <strong>safe because you only enriched or modeled on top of it</strong>, still no.</li>
</ul>
<p>That is the biggest thing I changed my mind about.</p>
<p>I used to think the narrow legal answer carried more practical protection than it actually does.</p>
<p>It doesn't.</p>
<p>The question I would ask now is much uglier and much better:</p>
<p><strong>If LinkedIn's lawyers subpoenaed everything tomorrow, what would they find?</strong></p>
<p>If the answer includes uncertain provenance, browser extensions touching LinkedIn, old Git history, model training on LinkedIn-derived features, or vendor contracts you have never really audited, then you have work to do.</p>
<p>Probably this week.</p>
<p>This article is not legal advice. You should talk to your own counsel for your own facts.</p>
<p>But as operator advice, I am comfortable being blunt: <strong>do not build your company on LinkedIn data</strong>.</p>
<p>Start by auditing what you already have. Then remove what you cannot defend. Then build future systems so this problem does not come back.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: LinkedIn Data Risk Checklist for Founders and Buyers</strong><br>
<span style="color:#555;">Use it to audit extensions, vendors, data provenance, model inputs, backups, and customer notification risk before someone else does it for you.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/linkedin-data-risk-checklist-3e3b074c.pdf?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you are starting from scratch, build on sources that do not route through LinkedIn at all. That is the only answer I trust now.</p>
<h2 id="references">References</h2>
<ol>
<li>Nubela, <em>Is LinkedIn Scraping Legal?</em> https://nubela.co/blog/is-linkedin-scraping-legal/</li>
<li><em>hiQ Labs, Inc. v. LinkedIn Corp.</em>, 31 F.4th 1180 (9th Cir. 2022).</li>
<li><em>LinkedIn Corporation v. Nubela Pte. Ltd., Proxycurl LLC, Steven Goh, and Bach Le</em>, Case No. 3:25-cv-00828, Complaint (N.D. Cal. Jan. 24, 2025). Matter subsequently settled.</li>
<li>LinkedIn User Agreement, effective Nov. 20, 2024. https://www.linkedin.com/legal/user-agreement</li>
<li>LeadGenius, <em>LinkedIn's Crackdown on Data Scrapers: Why Apollo.io and Seamless.ai Were Targeted, and Who's Next</em> https://www.leadgenius.com/resources/linkedins-crackdown-on-data-scrapers-why-apollo-io-and-seamless-ai-were-targeted--and-whos-next</li>
<li>LiGo, <em>LinkedIn Bans Apollo &amp; Seamless: Major Data Scraping Crackdown</em> https://ligo.ertiqah.com/blog/linkedins-major-crackdown-on-data-scraping-apollo-and-seamless-company-pages-gone</li>
<li>18 U.S.C. § 1030(g). https://www.law.cornell.edu/uscode/text/18/1030</li>
</ol>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Guide to Lookalike Prospecting (Code Snippets + GitHub Project) ]]></title>
        <description><![CDATA[ A customer sought out recommendations for his problem: “I have been experimenting with NinjaPear using my AI agents to find investors and leads for my company.” In this article, I’m going to show you how to build a full agentic lead generation system with PydanticAI, NinjaPear, and a small ]]></description>
        <link>https://nubela.co/blog/look-alike-prospecting/</link>
        <guid isPermaLink="false">69e0c8e044d9df00016fef7b</guid>
        <category><![CDATA[ look alike prospecting ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Thu, 16 Apr 2026 19:32:48 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_10.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>A customer sought out recommendations for his problem: <strong>“I have been experimenting with NinjaPear using my AI agents to find investors and leads for my company.”</strong> In this article, I’m going to show you how to build a full <strong>agentic lead generation system</strong> with <strong>PydanticAI</strong>, <strong>NinjaPear</strong>, and a small set of supporting tools, including the exact 4 loops, the code structure, and the GitHub project you can ship.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Sales_Professionals</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/executivegtm-47</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">The stale data problem you're describing isn't really an Apollo problem, it's a database problem... by the time you're reaching out the information is already months old.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Sales_Professionals/comments/1sdjgbp/cant_use_apollo_anymore_whats_a_better/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="github-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f6f8fa;">
<strong>💻 Full code on GitHub: lookalike-prospecting-guide</strong><br>
<span style="color:#555;">A runnable starter repo with the 4 loops, Pydantic models, synthetic CSV seeds, sample NinjaPear-shaped payloads, and tests.</span><br>
<code style="display:inline-block;margin-top:10px;padding:6px 10px;background:#eaecef;border-radius:4px;font-family:monospace;font-size:13px;">git clone https://github.com/NinjaPear-Shares/lookalike-prospecting-guide.git</code><br>
<a href="https://github.com/NinjaPear-Shares/lookalike-prospecting-guide?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#24292f;color:#fff;border-radius:6px;text-decoration:none;">View on GitHub →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="what-this-guide-does">What this guide does</h2>
<p>This is a developer guide for <strong>look alike prospecting</strong> inside an agentic SDR system.</p>
<p>It covers four loops:</p>
<ul>
<li><strong>Competitor → Customers</strong>: turn one known company into additive prospect accounts.</li>
<li><strong>CRM Account → Competitors</strong>: widen your account universe from closed-won seeds.</li>
<li><strong>CRM Contact → Similar People</strong>: turn one good contact into many role-adjacent people at relevant companies.</li>
<li><strong>Company → Updates</strong>: rank the best prospects by visible timing signals.</li>
</ul>
<p>That is the whole job here. I’m going to show the loops, the code, the sample responses, the models, and the guardrails that keep this from becoming a fancy way to buy bad leads faster.</p>
<h2 id="lookalike-prospecting-without-the-bullshit">Lookalike prospecting, without the bullshit</h2>
<p>Look alike prospecting is not “find me companies with similar headcount.” It is generating new accounts or people that resemble proven wins across <strong>fit, context, and timing</strong>. Most tools stop at fit. That is why most outputs feel generic.</p>
<p>Most lookalike prospecting products are just firmographic cloning with an AI label attached. They fail for ordinary reasons: dirty seeds, weak source signals, no suppression layer, and scoring logic nobody can explain once a rep asks why a company is on the list.</p>
<p>Clean input is boring. That is why it works. Start with <strong>closed-won</strong> first. Split by use case. Exclude <strong>existing customers, churned accounts, open opps, partners, agencies, and test junk</strong> before you enrich anything. A 20-account clean seed will beat a 2,000-account blended mess almost every time.</p>
<p>The signal stack is not equal. Firmographics are table stakes. Technographics add context. Relationship data is stronger. Trigger data handles timing. If you already have customer work emails in CRM, Similar People is usually your best 1→N move.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/cursedboy328</span>
<span style="color:#878a8c;">· ▲ 61</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">ran 464k cold emails last year across clients. Tested every list source out there... Ended up building our own scraping stack for almost everything because the bought data is stale, expensive, and everyone else is emailing the same contacts.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1r0tqh5/every_scraping_method_we_use_for_cold_email_and/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="the-4-agent-loops">The 4 agent loops</h2>
<p>The system has four loops because there are four separate problems.</p>
<ol>
<li><strong>Competitor to customers</strong> gives you fast account expansion.</li>
<li><strong>CRM accounts to competitors</strong> gives you clean market widening.</li>
<li><strong>CRM contacts to similar people</strong> gives you additive people discovery.</li>
<li><strong>Triggers to outreach</strong> gives you timing.</li>
</ol>
<p>Do not collapse all four into one big pipeline on day one. Keep them separate. It makes debugging easier, measurement easier, and failure less ambiguous.</p>
<h2 id="loop-1-competitor-to-customers">Loop 1: Competitor to customers</h2>
<p><strong>Problem:</strong> You know a competitor or adjacent company and want a prospect list fast.</p>
<p><strong>Solution:</strong> Use the <a href="https://nubela.co/companies?ref=nubela.co">Customer API</a> customer listing endpoint to find companies already buying from that vendor or sitting in its ecosystem.</p>
<p>This endpoint is a good starting point because it returns three relationship buckets: <code>customers</code>, <code>investors</code>, and <code>partner_platforms</code>. The docs also matter here. Cost is <strong>1 credit per request + 2 credits per company returned</strong>. <code>quality_filter</code> defaults to <code>true</code>, which filters junk TLDs and unreachable sites. Good default.</p>
<pre><code class="language-python">from src.clients.ninjapear import NinjaPearClient
from src.models import ProspectAccount

client = NinjaPearClient()
response = client.get_customer_listing(&quot;https://stripe.com&quot;)
accounts = [
    ProspectAccount.from_customer_listing(item, source=&quot;customer_listing&quot;)
    for item in response[&quot;customers&quot;]
]
</code></pre>
<p>Sample response, using the same shape as NinjaPear docs:</p>
<pre><code class="language-json">{
  &quot;customers&quot;: [
    {
      &quot;name&quot;: &quot;Apple&quot;,
      &quot;description&quot;: &quot;Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide.&quot;,
      &quot;tagline&quot;: &quot;Think different.&quot;,
      &quot;website&quot;: &quot;https://www.apple.com&quot;,
      &quot;company_logo_url&quot;: &quot;https://nubela.co/api/v1/company/logo?website=https%3A%2F%2Fwww.apple.com&quot;,
      &quot;id&quot;: &quot;abc123&quot;,
      &quot;industry&quot;: 45202030,
      &quot;specialties&quot;: [&quot;Technology&quot;, &quot;Consumer Electronics&quot;],
      &quot;x_profile&quot;: &quot;https://x.com/Apple&quot;
    }
  ],
  &quot;investors&quot;: [
    {
      &quot;name&quot;: &quot;Sequoia Capital&quot;,
      &quot;description&quot;: &quot;Sequoia Capital is a venture capital firm focused on technology companies.&quot;,
      &quot;tagline&quot;: null,
      &quot;website&quot;: &quot;https://www.sequoiacap.com&quot;,
      &quot;company_logo_url&quot;: &quot;https://nubela.co/api/v1/company/logo?website=https%3A%2F%2Fwww.sequoiacap.com&quot;,
      &quot;id&quot;: &quot;def456&quot;,
      &quot;industry&quot;: 40203010,
      &quot;specialties&quot;: [&quot;Venture Capital&quot;, &quot;Growth Equity&quot;],
      &quot;x_profile&quot;: &quot;https://x.com/sequoia&quot;
    }
  ],
  &quot;partner_platforms&quot;: [
    {
      &quot;name&quot;: &quot;Amazon Web Services&quot;,
      &quot;description&quot;: &quot;Amazon Web Services provides cloud computing platforms and APIs.&quot;,
      &quot;tagline&quot;: null,
      &quot;website&quot;: &quot;https://aws.amazon.com&quot;,
      &quot;company_logo_url&quot;: &quot;https://nubela.co/api/v1/company/logo?website=https%3A%2F%2Faws.amazon.com&quot;,
      &quot;id&quot;: &quot;ghi789&quot;,
      &quot;industry&quot;: 45101010,
      &quot;specialties&quot;: [&quot;Cloud Computing&quot;, &quot;Infrastructure&quot;],
      &quot;x_profile&quot;: &quot;https://x.com/awscloud&quot;
    }
  ],
  &quot;next_page&quot;: &quot;https://nubela.co/api/v1/customer/listing?website=https://www.stripe.com&amp;cursor=abc123&quot;
}
</code></pre>
<p>The flow is simple:</p>
<ul>
<li>input website</li>
<li>customer list</li>
<li>normalize</li>
<li>suppress existing CRM accounts</li>
<li>score</li>
</ul>
<p>Expected normalized output:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Apple&quot;,
  &quot;website&quot;: &quot;https://www.apple.com&quot;,
  &quot;industry&quot;: &quot;45202030&quot;,
  &quot;source&quot;: &quot;customer_listing&quot;,
  &quot;source_evidence&quot;: [
    &quot;Returned by customer_listing&quot;,
    &quot;Company id: abc123&quot;
  ],
  &quot;fit_score&quot;: 0.65,
  &quot;relationship_score&quot;: 0.85,
  &quot;timing_score&quot;: 0.25
}
</code></pre>
<p>A workable outreach angle is short and specific: <strong>you already sell into the same ecosystem as Stripe, so this is not a random account pulled from firmographic filters</strong>.</p>
<h2 id="loop-2-crm-accounts-to-competitors">Loop 2: CRM accounts to competitors</h2>
<p><strong>Problem:</strong> You have closed-won accounts in CRM and want to widen the account universe around them.</p>
<p><strong>Solution:</strong> Use the Competitor Listing Endpoint on each CRM account website, merge results, dedupe, suppress, score.</p>
<p>This is the cleanest 0→1 account expansion loop in the stack. It starts with proven wins. That matters more than people think.</p>
<pre><code class="language-python">from src.clients.ninjapear import NinjaPearClient
from src.scoring import score_account

client = NinjaPearClient()

for website in seed_account_websites:
    competitors = client.get_competitor_listing(website)
    for comp in competitors[&quot;competitors&quot;]:
        scored = score_account(comp, source=&quot;competitor_listing&quot;)
        if scored.total_score &gt;= 0.72:
            save_candidate(scored)
</code></pre>
<p>Sample response:</p>
<pre><code class="language-json">{
  &quot;competitors&quot;: [
    {
      &quot;name&quot;: &quot;Adyen&quot;,
      &quot;website&quot;: &quot;https://www.adyen.com&quot;,
      &quot;description&quot;: &quot;Financial technology platform for enterprise businesses.&quot;,
      &quot;competition_type&quot;: &quot;product_category_overlap&quot;,
      &quot;reason&quot;: &quot;Both companies offer payment infrastructure and enterprise checkout products.&quot;,
      &quot;industry&quot;: 40204010
    },
    {
      &quot;name&quot;: &quot;PayPal&quot;,
      &quot;website&quot;: &quot;https://www.paypal.com&quot;,
      &quot;description&quot;: &quot;Digital payments platform for consumers and merchants.&quot;,
      &quot;competition_type&quot;: &quot;organic_seo_overlap&quot;,
      &quot;reason&quot;: &quot;Both companies rank for overlapping payments-related organic search terms.&quot;,
      &quot;industry&quot;: 40204010
    }
  ],
  &quot;next_page&quot;: null
}
</code></pre>
<p>Expected scored output with evidence retained:</p>
<table>
<thead>
<tr>
<th>Account</th>
<th>Evidence</th>
<th style="text-align: right;">Fit</th>
<th style="text-align: right;">Relationship</th>
<th style="text-align: right;">Timing</th>
<th style="text-align: right;">Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>Adyen</td>
<td><code>product_category_overlap</code></td>
<td style="text-align: right;">0.70</td>
<td style="text-align: right;">0.72</td>
<td style="text-align: right;">0.20</td>
<td style="text-align: right;">0.5820</td>
</tr>
<tr>
<td>Checkout.com</td>
<td><code>product_category_overlap</code></td>
<td style="text-align: right;">0.70</td>
<td style="text-align: right;">0.72</td>
<td style="text-align: right;">0.20</td>
<td style="text-align: right;">0.5820</td>
</tr>
<tr>
<td>PayPal</td>
<td><code>organic_seo_overlap</code></td>
<td style="text-align: right;">0.70</td>
<td style="text-align: right;">0.58</td>
<td style="text-align: right;">0.20</td>
<td style="text-align: right;">0.5330</td>
</tr>
</tbody>
</table>
<p>This is the part I like about competitor data when it is explicit. You keep the reason. You do not throw it away. Product overlap usually deserves more weight than shared SEO adjacency because it points to budget competition, not just similar search surfaces.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/No-Rock-1875</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">A quick spreadsheet filter on the username part plus a lookup of the company’s current employee list ... weeds out a lot of dead leads.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1s2uswm/how_do_you_guys_filter_out_the_junk_leads_from/ocax9cd/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is not about competitors directly, but it points at the same thing: most list quality problems are filtering problems, not enrichment problems.</p>
<h2 id="loop-3-crm-contacts-to-similar-people">Loop 3: CRM contacts to similar people</h2>
<p><strong>Problem:</strong> You already have customer contacts in CRM and want additive 1→N growth.</p>
<p><strong>Solution:</strong> Use the Similar People Endpoint from work emails to find similar roles at other relevant companies.</p>
<p>This is the real 1→N motion if your CRM has actual work emails. Not guessed emails. Real ones.</p>
<pre><code class="language-python">from src.clients.ninjapear import NinjaPearClient
from src.models import ProspectPerson

client = NinjaPearClient()

for work_email in customer_contact_emails:
    similar_people = client.get_similar_people(work_email=work_email)
    for person in similar_people[&quot;results&quot;]:
        prospect = ProspectPerson.from_similar_person(person)
        if not is_suppressed_person(prospect):
            save_person(prospect)
</code></pre>
<p>Sample response:</p>
<pre><code class="language-json">{
  &quot;results&quot;: [
    {
      &quot;full_name&quot;: &quot;Will Cannon&quot;,
      &quot;first_name&quot;: &quot;Will&quot;,
      &quot;last_name&quot;: &quot;Cannon&quot;,
      &quot;bio&quot;: &quot;Founder building B2B lead generation software.&quot;,
      &quot;work_email&quot;: &quot;[email protected]&quot;,
      &quot;role&quot;: &quot;Founder &amp; CEO&quot;,
      &quot;company_name&quot;: &quot;UpLead&quot;,
      &quot;company_website&quot;: &quot;https://uplead.com&quot;,
      &quot;city&quot;: &quot;Walnut&quot;,
      &quot;country&quot;: &quot;US&quot;,
      &quot;x_handle&quot;: &quot;willcannon&quot;,
      &quot;input_role&quot;: &quot;Founder &amp; CEO&quot;
    },
    {
      &quot;full_name&quot;: &quot;Henry Schuck&quot;,
      &quot;work_email&quot;: &quot;[email protected]&quot;,
      &quot;role&quot;: &quot;CEO &amp; Chairman&quot;,
      &quot;company_name&quot;: &quot;ZoomInfo&quot;,
      &quot;company_website&quot;: &quot;https://zoominfo.com&quot;,
      &quot;city&quot;: &quot;Vancouver&quot;,
      &quot;country&quot;: &quot;US&quot;,
      &quot;input_role&quot;: &quot;Founder &amp; CEO&quot;
    }
  ]
}
</code></pre>
<p>Expected normalized output:</p>
<pre><code class="language-json">{
  &quot;full_name&quot;: &quot;Will Cannon&quot;,
  &quot;work_email&quot;: &quot;[email protected]&quot;,
  &quot;company_website&quot;: &quot;https://uplead.com&quot;,
  &quot;role&quot;: &quot;Founder &amp; CEO&quot;,
  &quot;source&quot;: &quot;similar_people&quot;,
  &quot;source_evidence&quot;: [
    &quot;Matched as similar person to Founder &amp; CEO&quot;
  ],
  &quot;account_score&quot;: 0.76,
  &quot;person_score&quot;: 0.80
}
</code></pre>
<p>This is the loop where the system starts to feel good, because you are transferring buyer patterns from known-good contacts instead of guessing titles from a huge database.</p>
<p>The published Similar People benchmarks are useful because they show where the endpoint is strongest:</p>
<ul>
<li><strong>Tim Cook / Apple</strong>: 18 attempted, 18 found, <strong>100% yield</strong></li>
<li><strong>Elon Musk / Tesla</strong>: 11 attempted, 11 found, <strong>100% yield</strong></li>
<li><strong>Patrick Collison / Stripe</strong>: 19 attempted, 16 found, <strong>84% yield</strong></li>
<li><strong>Bryan Irace / Stripe engineering manager</strong>: 19 attempted, 12 found, <strong>63% yield</strong></li>
<li><strong>Robert Heaton / Stripe MTS</strong>: 65 attempted, 36 found, <strong>55% yield</strong></li>
</ul>
<p>That decay lower in the org chart is normal. Executives are more public. Mid-level people are noisier.</p>
<p>And yes, here is the context-specific example outreach angle from the plan:</p>
<blockquote>
<p>“Hey! Your competitor from Company X just joined NinjaPear. It happens that NinjaPear has a feature to extract customers of your company. Would you like to join NinjaPear to also gain an edge against your competitors?”</p>
</blockquote>
<p>Use that as an example of context, not default copy. If the agent cannot show the evidence, the rep should not send the email.</p>
<h2 id="loop-4-triggers-to-outreach">Loop 4: Triggers to outreach</h2>
<p><strong>Problem:</strong> Your lookalikes are plausible, but you still do not know who to contact now.</p>
<p><strong>Solution:</strong> Use Company Updates or Monitor signals to prioritize accounts showing real change.</p>
<p>Trigger data is a ranking layer. It is not a prospect source.</p>
<pre><code class="language-python">from src.clients.ninjapear import NinjaPearClient
from src.outreach import draft_outreach

client = NinjaPearClient()

updates = client.get_company_updates(&quot;https://example.com&quot;)
for event in updates[&quot;results&quot;]:
    if event[&quot;category&quot;] in {&quot;website update&quot;, &quot;blog&quot;, &quot;x&quot;}:
        draft = draft_outreach(account, event)
        save_draft(draft)
</code></pre>
<p>Sample response:</p>
<pre><code class="language-json">{
  &quot;results&quot;: [
    {
      &quot;title&quot;: &quot;Pricing page updated, new Enterprise tier added&quot;,
      &quot;link&quot;: &quot;https://example.com/pricing&quot;,
      &quot;category&quot;: &quot;website update&quot;,
      &quot;pub_date&quot;: &quot;Thu, 27 Feb 2026 07:00:00 GMT&quot;,
      &quot;summary&quot;: &quot;Enterprise packaging was added to the pricing page.&quot;
    },
    {
      &quot;title&quot;: &quot;Announcing global payments expansion&quot;,
      &quot;link&quot;: &quot;https://example.com/blog/global-payments&quot;,
      &quot;category&quot;: &quot;blog&quot;,
      &quot;pub_date&quot;: &quot;Thu, 27 Feb 2026 10:00:00 GMT&quot;,
      &quot;summary&quot;: &quot;The company announced broader market coverage for payments.&quot;
    }
  ]
}
</code></pre>
<p>Expected outreach draft:</p>
<pre><code class="language-json">{
  &quot;subject&quot;: &quot;Saw this at ExampleCo&quot;,
  &quot;body&quot;: &quot;Saw the update: Pricing page updated, new Enterprise tier added. Usually that means the team is changing packaging, priorities, or buyer motion.&quot;,
  &quot;evidence&quot;: [
    &quot;Returned in customer listing for Stripe&quot;,
    &quot;Trigger: Pricing page updated, new Enterprise tier added&quot;
  ],
  &quot;confidence&quot;: 0.78,
  &quot;requires_review&quot;: true
}
</code></pre>
<p>The Company Monitor docs are refreshingly specific on credit usage:</p>
<ul>
<li><strong>20 weekly targets</strong>: ~346 credits/month</li>
<li><strong>10 daily competitor targets</strong>: ~1,203 credits/month</li>
<li><strong>5 daily prospect accounts, blog + X only</strong>: ~453 credits/month</li>
</ul>
<p>That is enough to budget the loop without guessing.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">A lot of people are building #GTM engines now, but the real effectiveness comes down to which market signals you track and how strong your market intelligence is. In B2B, we’ve found that not all signals are equal.</p>&mdash; lev8 (@lev8ai) <a href="https://x.com/lev8ai/status/2043525117700088214?ref=nubela.co">Mon Apr 13 03:02:09 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That is the right framing. Not all signals are equal. A pricing page change is usually more actionable than another vague “high intent” badge.</p>
<h2 id="repo-structure">Repo structure</h2>
<p>Keep this concrete.</p>
<p><strong>Push from the real project root, not from a parent wrapper folder.</strong> This sounds obvious because it is obvious. People still get it wrong.</p>
<pre><code class="language-text">README.md
.env.example
pyproject.toml
data/
  closed_won_accounts.csv
  crm_contacts.csv
  suppression_accounts.csv
  suppression_people.csv
examples/
  sample_customer_listing.json
  sample_competitor_listing.json
  sample_similar_people.json
  sample_updates.json
src/
  config.py
  models.py
  scoring.py
  suppressions.py
  outreach.py
  clients/
    ninjapear.py
  agents/
    coordinator.py
    research_agent.py
    scoring_agent.py
    copy_agent.py
  pipelines/
    loop_competitor_to_customers.py
    loop_crm_to_competitors.py
    loop_contacts_to_similar_people.py
    loop_triggers_to_outreach.py
tests/
  test_scoring.py
  test_suppressions.py
</code></pre>
<p>There is no reason to bury the project inside a wrapper folder. If someone clones the repo, they should immediately see <code>README.md</code>, <code>pyproject.toml</code>, <code>src/</code>, <code>data/</code>, and <code>tests/</code> at the top level.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/EntrepreneurRideAlong</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/TeslaLegacy</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">the temptation is to try and replicate the full clay workflow with cheaper pieces but honestly that usually ends up messier than just paying for one tool that does the job. the stacking problem is real though, you end up spending more time maintaining integrations than actually doing outbound.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/EntrepreneurRideAlong/comments/1surmtp/trying_to_design_the_leanest_possible_gtm_stack/oi7x375/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is exactly why repo structure matters. If the code path is messy, the workflow will be messy too.</p>
<h2 id="core-pydantic-models">Core Pydantic models</h2>
<p>Keep this practical. The point of Pydantic here is not ceremony. It is to force evidence to stay attached to the record.</p>
<h3 id="seedaccount">SeedAccount</h3>
<p>Fields: <code>name</code>, <code>website</code>, <code>segment</code>, <code>source</code>, <code>is_closed_won</code>, <code>arr_band</code></p>
<h3 id="seedcontact">SeedContact</h3>
<p>Fields: <code>full_name</code>, <code>work_email</code>, <code>company_website</code>, <code>role</code>, <code>seniority</code></p>
<h3 id="prospectaccount">ProspectAccount</h3>
<p>Fields: <code>name</code>, <code>website</code>, <code>industry</code>, <code>source</code>, <code>source_evidence</code>, <code>fit_score</code>, <code>relationship_score</code>, <code>timing_score</code></p>
<h3 id="prospectperson">ProspectPerson</h3>
<p>Fields: <code>full_name</code>, <code>work_email</code>, <code>company_website</code>, <code>role</code>, <code>source</code>, <code>source_evidence</code>, <code>account_score</code>, <code>person_score</code></p>
<h3 id="outreachdraft">OutreachDraft</h3>
<p>Fields: <code>subject</code>, <code>body</code>, <code>evidence</code>, <code>confidence</code>, <code>requires_review</code></p>
<pre><code class="language-python">from pydantic import BaseModel, HttpUrl
from typing import List, Optional

class ProspectAccount(BaseModel):
    name: str
    website: HttpUrl
    industry: Optional[str] = None
    source: str
    source_evidence: List[str] = []
    fit_score: float = 0.0
    relationship_score: float = 0.0
    timing_score: float = 0.0
</code></pre>
<p>If a prospect loses its evidence trail between raw JSON and outbound draft, the model failed.</p>
<h2 id="ninjapear-client-wrapper">NinjaPear client wrapper</h2>
<p>Use a thin wrapper. Do not build a fake framework.</p>
<p>Also, if you are building this with a coding agent, point it to <code>https://nubela.co/llms-full.txt</code>. The docs are already structured for LLMs and include endpoint coverage, rate limits, pagination, timeout guidance, and examples.</p>
<pre><code class="language-python">import os
import httpx

class NinjaPearClient:
    def __init__(self, api_key: str | None = None):
        self.api_key = api_key or os.environ[&quot;NINJAPEAR_API_KEY&quot;]
        self.base_url = &quot;https://nubela.co&quot;
        self.headers = {&quot;Authorization&quot;: f&quot;Bearer {self.api_key}&quot;}

    def get_customer_listing(self, website: str):
        r = httpx.get(
            f&quot;{self.base_url}/api/v1/customer/listing&quot;,
            params={&quot;website&quot;: website},
            headers=self.headers,
            timeout=100.0,
        )
        r.raise_for_status()
        return r.json()
</code></pre>
<p>Then add the obvious follow-up methods for competitor listing, similar people, and company updates.</p>
<p>The API behavior that matters:</p>
<ul>
<li>normal rate limit is <strong>300 requests/minute</strong></li>
<li>the effective window is <strong>1,500 requests per 5 minutes</strong></li>
<li>trial accounts are limited to <strong>2 requests/minute</strong></li>
<li>long-running endpoints can take <strong>30 to 60 seconds</strong></li>
<li>recommended timeout is <strong>100 seconds</strong></li>
<li><code>429</code> needs exponential backoff</li>
<li><code>404</code> is charged, failed requests are otherwise not charged</li>
</ul>
<p>Those details change how you write the client. They are not side notes.</p>
<h2 id="scoring-and-suppressions">Scoring and suppressions</h2>
<p>One short intro and then code.</p>
<p>Make scoring simple enough that a human can understand it.</p>
<pre><code class="language-python">def score_account(account) -&gt; float:
    return round(
        (account.fit_score * 0.40)
        + (account.relationship_score * 0.35)
        + (account.timing_score * 0.25),
        4,
    )
</code></pre>
<p>That weighting is fine as a default because it gives fit first position, gives relationship data real weight, and stops timing from hijacking the list.</p>
<pre><code class="language-python">def is_suppressed_account(account, suppression_websites: set[str]) -&gt; bool:
    return str(account.website) in suppression_websites
</code></pre>
<p>Suppress before enrichment:</p>
<ul>
<li>existing customers</li>
<li>open opps</li>
<li>churned accounts you should not re-enter yet</li>
<li>partners</li>
<li>agencies</li>
<li>internal domains</li>
<li>obvious bad domains</li>
</ul>
<p>If you enrich first and suppress later, you are paying to make junk more detailed.</p>
<p>I am also skeptical of black-box intent. If the system cannot tell you why an account is hot, the score is decorative.</p>
<h2 id="outreach-generation">Outreach generation</h2>
<p>The copy agent should only use evidence the system can show.</p>
<pre><code class="language-python">SYSTEM_PROMPT = &quot;&quot;&quot;
Write short outbound emails using only the supplied evidence.
Do not invent facts.
If evidence is weak, say so and mark requires_review=true.
&quot;&quot;&quot;
</code></pre>
<pre><code class="language-python">def build_evidence_block(account, event=None):
    evidence = list(account.source_evidence)
    if event:
        evidence.append(f&quot;Trigger: {event['title']}&quot;)
    return evidence
</code></pre>
<p>That is the whole rule. Do not let the model improvise facts because it has a good tone. Tone does not save a false claim.</p>
<h2 id="how-to-run-the-project">How to run the project</h2>
<p>Practical checklist:</p>
<pre><code class="language-bash">uv venv
source .venv/bin/activate
uv pip install -e .
cp .env.example .env
export NINJAPEAR_API_KEY=your_key_here
python -m src.pipelines.loop_competitor_to_customers
python -m src.pipelines.loop_crm_to_competitors
python -m src.pipelines.loop_contacts_to_similar_people
python -m src.pipelines.loop_triggers_to_outreach
</code></pre>
<p>And yes, inspect the full endpoint docs in <code>https://nubela.co/llms-full.txt</code> when wiring parameters, pagination, retries, and endpoint-specific schemas. The article gives you the architecture. The docs give you the sharp edges.</p>
<h2 id="what-to-measure">What to measure</h2>
<p>Track this by loop source, not just in aggregate:</p>
<ul>
<li>suppression rate</li>
<li>enrichment rate</li>
<li>reply rate</li>
<li>meeting rate</li>
<li>opportunity rate</li>
<li>average evidence depth per record</li>
</ul>
<p>If Similar People produces fewer rows but twice the meetings, that is the better loop.</p>
<h2 id="mistakes-to-avoid">Mistakes to avoid</h2>
<p>Keep this short.</p>
<ul>
<li>giant blended seed lists</li>
<li>enriching too early</li>
<li>no suppression layer</li>
<li>blind trust in black-box intent</li>
<li>full auto before review</li>
<li>outreach that cites evidence the system cannot prove</li>
<li>pushing a GitHub repo with the real project buried in a nested folder like some kind of maniac</li>
</ul>
<p>Most failures here are not model failures. They are operating mistakes.</p>
<p>If you want the right next step, clone the repo, point your coding agent at <code>https://nubela.co/llms-full.txt</code>, and run the four loops against your own closed-won seeds first. That will tell you more than another week spent tuning a giant dirty list.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Guide to Agentic Lead Generation in 2026 + Code Samples + GitHub Project ]]></title>
        <description><![CDATA[ Most lead generation content is useless if you need to actually build the thing. A customer sought out recommendations for his problem: “I have been experimenting with NinjaPear using my AI agents to find investors and leads for my company.” In this guide, I’m going to show you how ]]></description>
        <link>https://nubela.co/blog/agentic-lead-generation/</link>
        <guid isPermaLink="false">69e0c07d44d9df00016fef75</guid>
        <category><![CDATA[ lead generation ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Thu, 16 Apr 2026 18:57:01 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_9.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Most <strong>lead generation</strong> content is useless if you need to actually build the thing. A customer sought out recommendations for his problem: “I have been experimenting with NinjaPear using my AI agents to find investors and leads for my company.” In this guide, I’m going to show you how to build a full <strong>agentic lead generation</strong> system with <strong>PydanticAI</strong>, <strong>NinjaPear</strong>, and a small set of supporting tools, including the exact 4 loops, the code structure, and the GitHub project you can ship.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/readypenguinn</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Spray and pray use to work earlier as it was easier to achieve volume, but now if you are not doing intent based outbound you will burn money and time</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1o6leml/is_everybody_spamming_the_same_person_curious/njitwpx/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="github-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f6f8fa;">
<strong>💻 Full code on GitHub: agentic-lead-generation</strong><br>
<span style="color:#555;">A runnable Python starter project with NinjaPear wrappers, Pydantic models, a 4-loop pipeline, mocked outreach helpers, and an agent entrypoint.</span><br>
<code style="display:inline-block;margin-top:10px;padding:6px 10px;background:#eaecef;border-radius:4px;font-family:monospace;font-size:13px;">git clone https://github.com/NinjaPear-Shares/agentic-lead-generation.git</code><br>
<a href="https://github.com/NinjaPear-Shares/agentic-lead-generation?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#24292f;color:#fff;border-radius:6px;text-decoration:none;">View on GitHub →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="build-the-system-first">Build the system first</h2>
<p>If I were a founder building outbound against Stripe and Shopify, I would not start with prompts. I would start with a system.</p>
<p>These are the 4 loops:</p>
<ul>
<li><strong>Loop 1, customer loop:</strong> pull likely customers of Stripe and Shopify, because a competitor's customer is better evidence than a random firmographic export</li>
<li><strong>Loop 2, competitor loop:</strong> expand into adjacent companies, because most teams do not have a lead shortage, they have a market map shortage</li>
<li><strong>Loop 3, people loop:</strong> find role-alike buyers only after account qualification, because people-first prospecting usually gives you a larger pile of irrelevant contacts</li>
<li><strong>Loop 4, timing loop:</strong> enrich and monitor those accounts for changes, because without timing you do not have agentic lead generation, you have a nicer spreadsheet</li>
</ul>
<p>That is what this guide does. It wires those four loops into one workflow and shows the code and response shapes I would use if I were trying to sell into the same market as Stripe and Shopify.</p>
<p>The whole workflow is this:</p>
<p><code>seed domains -&gt; customer loop -&gt; competitor loop -&gt; people loop -&gt; timing loop -&gt; queue</code></p>
<p>And the <code>main()</code> is boring on purpose.</p>
<pre><code class="language-python">def main():
    seeds = [&quot;https://stripe.com&quot;, &quot;https://shopify.com&quot;]
    accounts = pull_competitor_customers(seeds)
    accounts = expand_competitors(accounts)
    people = find_similar_people(accounts)
    enriched = enrich_and_monitor(accounts, people)
    queue = build_outreach_queue(enriched)
    return queue
</code></pre>
<p>That is enough structure to build around.</p>
<p>When I was running FluxoMetric, this was my mistake for a while. I thought better modeling would fix bad market inputs. It does not. It just gives you a cleaner wrong answer.</p>
<h2 id="the-stack">The stack</h2>
<p>Keep the stack simple:</p>
<ul>
<li><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> for company, customer, competitor, people, funding, updates, and monitor data</li>
<li>PydanticAI for orchestration, typed tools, and validated outputs</li>
<li>OpenRouter as the model gateway</li>
<li>Mock helpers for email verification and email sending</li>
</ul>
<p>Install what you need:</p>
<pre><code class="language-bash">pip install ninjapear pydantic-ai httpx pydantic python-dotenv
</code></pre>
<p>Minimal settings model:</p>
<pre><code class="language-python">from pydantic import BaseModel
import os

class Settings(BaseModel):
    ninjapear_api_key: str
    openrouter_api_key: str

settings = Settings(
    ninjapear_api_key=os.environ[&quot;NINJAPEAR_API_KEY&quot;],
    openrouter_api_key=os.environ[&quot;OPENROUTER_API_KEY&quot;],
)
</code></pre>
<p>PydanticAI through OpenRouter:</p>
<pre><code class="language-python">from pydantic_ai import Agent
from pydantic_ai.models.openrouter import OpenRouterModel
from pydantic_ai.providers.openrouter import OpenRouterProvider

model = OpenRouterModel(
    &quot;anthropic/claude-sonnet-4-5&quot;,
    provider=OpenRouterProvider(api_key=settings.openrouter_api_key),
)
agent = Agent(model)
</code></pre>
<p>My opinion here is straightforward. The model matters less than the data and the wiring. Most agentic lead generation demos fail because they are toys sitting on bad data.</p>
<p>The NinjaPear docs are useful here because they tell you the operational limits up front:</p>
<ul>
<li>up to <strong>300 requests/minute</strong></li>
<li>a <strong>1,500 request</strong> burst window over 5 minutes</li>
<li>trial accounts limited to <strong>2 requests/minute</strong></li>
<li>many endpoints take <strong>30 to 60 seconds</strong></li>
<li>recommended timeout: <strong>100 seconds</strong></li>
</ul>
<p>That is enough to design the pipeline without guessing.</p>
<h2 id="loop-1-pull-competitor-customers">Loop 1: Pull competitor customers</h2>
<p>If I were selling something that should land in the same accounts as Stripe or Shopify, this is where I would start.</p>
<p>A competitor’s customer is usually a better lead than a giant stale firmographic export. Not because it is magical. Because it is evidence of actual category demand.</p>
<h3 id="seed-your-domains">Seed your domains</h3>
<p>Start with companies your buyer already compares you against.</p>
<pre><code class="language-python">seeds = [
    &quot;https://stripe.com&quot;,
    &quot;https://shopify.com&quot;,
]
</code></pre>
<p>Do not start with 500 domains. Start with 2 to 10 and make sure the plumbing works.</p>
<h3 id="call-customer-listing">Call Customer Listing</h3>
<p>Use the <a href="https://nubela.co/companies?ref=nubela.co">Customer Listing API</a>.</p>
<p>These details matter:</p>
<ul>
<li>Endpoint: <code>GET /api/v1/customer/listing</code></li>
<li>Cost: <strong>1 credit/request + 2 credits/company returned</strong></li>
<li>Empty results can still cost you</li>
<li><code>quality_filter=true</code> should stay on unless you want junk</li>
<li>Pagination uses <code>next_page</code> and <code>cursor</code></li>
<li><code>page_size</code> supports <strong>1 to 200</strong>, default <strong>200</strong></li>
</ul>
<p>Official SDK setup:</p>
<pre><code class="language-python">import ninjapear

configuration = ninjapear.Configuration(
    host=&quot;https://nubela.co&quot;,
    access_token=&quot;YOUR_API_KEY&quot;,
)

with ninjapear.ApiClient(configuration) as api_client:
    api = ninjapear.CustomerAPIApi(api_client)
    response = api.get_customer_listing(
        website=&quot;https://www.stripe.com&quot;,
        quality_filter=True,
    )
</code></pre>
<p>Wrapper I would keep in a project:</p>
<pre><code class="language-python">import ninjapear
from urllib.parse import urlparse
from pydantic import BaseModel

class ProspectAccount(BaseModel):
    source_company: str
    relationship_type: str
    name: str
    website: str | None
    description: str | None = None
    specialties: list[str] = []
    x_profile: str | None = None


def normalize_domain(url: str) -&gt; str:
    return urlparse(url).netloc.replace(&quot;www.&quot;, &quot;&quot;)


def get_customer_listing(api_client, website: str, cursor: str | None = None, page_size: int = 200, quality_filter: bool = True):
    api = ninjapear.CustomerAPIApi(api_client)
    return api.get_customer_listing(
        website=website,
        cursor=cursor,
        page_size=page_size,
        quality_filter=quality_filter,
    )
</code></pre>
<p>Pagination helper:</p>
<pre><code class="language-python">from urllib.parse import urlparse, parse_qs


def paginate_customer_listing(api_client, website: str, page_size: int = 200):
    cursor = None
    while True:
        response = get_customer_listing(
            api_client,
            website=website,
            cursor=cursor,
            page_size=page_size,
            quality_filter=True,
        )
        yield response
        next_page = response.get(&quot;next_page&quot;) if isinstance(response, dict) else getattr(response, &quot;next_page&quot;, None)
        if not next_page:
            break
        cursor_values = parse_qs(urlparse(next_page).query).get(&quot;cursor&quot;, [])
        cursor = cursor_values[0] if cursor_values else None
        if not cursor:
            break
</code></pre>
<h3 id="parse-only-what-matters">Parse only what matters</h3>
<p>For lead generation, I do not treat all relationship types the same.</p>
<table>
<thead>
<tr>
<th>Relationship type</th>
<th>How to use it</th>
</tr>
</thead>
<tbody>
<tr>
<td>Customer</td>
<td>Primary prospect pool</td>
</tr>
<tr>
<td>Investor</td>
<td>Good for market mapping, weak as direct buyer signal</td>
</tr>
<tr>
<td>Partner platform</td>
<td>Useful for integrations and ecosystem plays</td>
</tr>
</tbody>
</table>
<p>Flatten the response into one account model:</p>
<pre><code class="language-python">def flatten_customer_response(source_company: str, payload) -&gt; list[ProspectAccount]:
    rows = []
    data = payload.to_dict() if hasattr(payload, &quot;to_dict&quot;) else payload
    for key, relationship_type in {
        &quot;customers&quot;: &quot;customer&quot;,
        &quot;investors&quot;: &quot;investor&quot;,
        &quot;partner_platforms&quot;: &quot;partner_platform&quot;,
    }.items():
        for item in data.get(key, []) or []:
            rows.append(
                ProspectAccount(
                    source_company=source_company,
                    relationship_type=relationship_type,
                    name=item.get(&quot;name&quot;, &quot;Unknown&quot;),
                    website=item.get(&quot;website&quot;),
                    description=item.get(&quot;description&quot;),
                    specialties=item.get(&quot;specialties&quot;) or [],
                    x_profile=item.get(&quot;x_profile&quot;),
                )
            )
    return rows
</code></pre>
<p>Sample response shape from the docs:</p>
<pre><code class="language-json">{
  &quot;customers&quot;: [
    {
      &quot;name&quot;: &quot;Apple&quot;,
      &quot;description&quot;: &quot;Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide.&quot;,
      &quot;tagline&quot;: &quot;Think different.&quot;,
      &quot;website&quot;: &quot;https://www.apple.com&quot;,
      &quot;company_logo_url&quot;: &quot;https://nubela.co/api/v1/company/logo?website=https%3A%2F%2Fwww.apple.com&quot;,
      &quot;id&quot;: &quot;abc123&quot;,
      &quot;industry&quot;: 45202030,
      &quot;specialties&quot;: [&quot;Technology&quot;, &quot;Consumer Electronics&quot;],
      &quot;x_profile&quot;: &quot;https://x.com/Apple&quot;
    }
  ],
  &quot;investors&quot;: [
    {
      &quot;name&quot;: &quot;Sequoia Capital&quot;,
      &quot;description&quot;: &quot;Sequoia Capital is a venture capital firm focused on technology companies.&quot;,
      &quot;tagline&quot;: null,
      &quot;website&quot;: &quot;https://www.sequoiacap.com&quot;,
      &quot;company_logo_url&quot;: &quot;https://nubela.co/api/v1/company/logo?website=https%3A%2F%2Fwww.sequoiacap.com&quot;,
      &quot;id&quot;: &quot;def456&quot;,
      &quot;industry&quot;: 40203010,
      &quot;specialties&quot;: [&quot;Venture Capital&quot;, &quot;Growth Equity&quot;],
      &quot;x_profile&quot;: &quot;https://x.com/sequoia&quot;
    }
  ],
  &quot;partner_platforms&quot;: [
    {
      &quot;name&quot;: &quot;Amazon Web Services&quot;,
      &quot;description&quot;: &quot;Amazon Web Services provides cloud computing platforms and APIs.&quot;,
      &quot;tagline&quot;: null,
      &quot;website&quot;: &quot;https://aws.amazon.com&quot;,
      &quot;company_logo_url&quot;: &quot;https://nubela.co/api/v1/company/logo?website=https%3A%2F%2Faws.amazon.com&quot;,
      &quot;id&quot;: &quot;ghi789&quot;,
      &quot;industry&quot;: 45101010,
      &quot;specialties&quot;: [&quot;Cloud Computing&quot;, &quot;Infrastructure&quot;],
      &quot;x_profile&quot;: &quot;https://x.com/awscloud&quot;
    }
  ],
  &quot;next_page&quot;: &quot;https://nubela.co/api/v1/customer/listing?website=https://www.stripe.com&amp;cursor=abc123&quot;
}
</code></pre>
<p>That is enough to build a real first pass.</p>
<p>What I would not do is dump investors and partner platforms straight into the outreach queue.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/cursedboy328</span>
<span style="color:#878a8c;">· ▲ 8</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Great point ... leads there are overused no matter the industry. Even thought you can anyway have better targeting and offer than others, you're competing with disadvantage straight away</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1qwm1rf/stop_using_apollo_for_leads_the_database_is/o3rhi0z/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the practical case for starting with competitor customer data instead of a shared database.</p>
<h3 id="dedupe-the-account-list">Dedupe the account list</h3>
<p>Dedupe by normalized domain.</p>
<pre><code class="language-python">from collections import OrderedDict


def dedupe_accounts(accounts: list[ProspectAccount]) -&gt; list[ProspectAccount]:
    deduped = OrderedDict()
    for account in accounts:
        key = normalize_domain(account.website) if account.website else account.name.lower()
        if key not in deduped:
            deduped[key] = account
    return list(deduped.values())
</code></pre>
<p>Most teams do not have a lead generation shortage. They have a data hygiene shortage.</p>
<h2 id="loop-2-expand-competitors">Loop 2: Expand competitors</h2>
<p>If Stripe and Shopify are your starting map, this loop is how you widen the search without turning it into random noise.</p>
<h3 id="find-adjacent-competitors">Find adjacent competitors</h3>
<p>Use the Competitor Listing endpoint.</p>
<p>Relevant details from the docs:</p>
<ul>
<li>Endpoint: <code>GET /api/v1/competitor/listing</code></li>
<li>Cost: <strong>2 credits per competitor returned</strong></li>
<li>There is a minimum request cost, so be selective</li>
</ul>
<p>Wrapper:</p>
<pre><code class="language-python">def get_competitors(api_client, website: str, cursor: str | None = None, page_size: int = 50):
    api = ninjapear.CompetitorAPIApi(api_client)
    return api.get_competitor_listing(website=website, cursor=cursor, page_size=page_size)
</code></pre>
<p>Sample response shape:</p>
<pre><code class="language-json">{
  &quot;competitors&quot;: [
    {
      &quot;company_name&quot;: &quot;Adyen&quot;,
      &quot;website&quot;: &quot;https://www.adyen.com&quot;,
      &quot;product_category_overlap&quot;: [&quot;payment processing&quot;, &quot;checkout&quot;, &quot;fraud tools&quot;],
      &quot;organic_seo_overlap&quot;: [&quot;payment gateway&quot;, &quot;merchant of record&quot;]
    },
    {
      &quot;company_name&quot;: &quot;Checkout.com&quot;,
      &quot;website&quot;: &quot;https://www.checkout.com&quot;,
      &quot;product_category_overlap&quot;: [&quot;payments infrastructure&quot;],
      &quot;organic_seo_overlap&quot;: [&quot;online payments&quot;]
    }
  ],
  &quot;next_page&quot;: null
}
</code></pre>
<p>This is enough. You have adjacent companies and the reasons they overlap.</p>
<h3 id="expand-one-layer-at-a-time">Expand one layer at a time</h3>
<p>Do not recurse forever.</p>
<pre><code class="language-python">def expand_competitors(api_client, seed_domains, max_depth=1):
    visited = set()
    frontier = list(seed_domains)
    discovered = []
    depth = 0

    while frontier and depth &lt; max_depth:
        next_frontier = []
        for website in frontier:
            if website in visited:
                continue
            visited.add(website)
            payload = get_competitors(api_client, website=website)
            data = payload.to_dict() if hasattr(payload, &quot;to_dict&quot;) else payload
            for item in data.get(&quot;competitors&quot;, []) or []:
                comp_website = item.get(&quot;website&quot;)
                if comp_website and comp_website not in visited:
                    discovered.append(comp_website)
                    next_frontier.append(comp_website)
        frontier = next_frontier
        depth += 1

    return discovered
</code></pre>
<p>One layer is usually enough to improve coverage without turning the account set into mush.</p>
<h3 id="track-provenance">Track provenance</h3>
<p>Every discovered account should carry provenance:</p>
<ul>
<li>which seed exposed it</li>
<li>which competitor chain exposed it</li>
<li>what relationship type brought it into the graph</li>
</ul>
<p>That gives you something to score later. It also gives you something real to message against.</p>
<h3 id="stop-the-loop-early">Stop the loop early</h3>
<p>Use three brakes:</p>
<ul>
<li><code>max_depth</code></li>
<li>domain dedupe</li>
<li>account caps</li>
</ul>
<p>If you do not cap this, you end up exploring the whole category and calling it prospecting.</p>
<pre><code class="language-python"># pseudocode
async for website in frontier:
    if website not in visited and len(discovered) &lt; account_cap:
        fetch competitor listing
        append new domains
</code></pre>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/et-nad</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">80% might be on apollo depending on niche. You can reach out to 20% of them via other providers but after that what then? You will have to go back to 80% of leads and think how can you stand out.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1qwm1rf/stop_using_apollo_for_leads_the_database_is/o3pvno8/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the argument for market mapping. You need better discovery, not just another seat on the same database.</p>
<h2 id="loop-3-find-similar-people">Loop 3: Find similar people</h2>
<p>This is the people layer. It should happen after account filtering.</p>
<h3 id="start-with-the-account">Start with the account</h3>
<p>Only run people discovery on accounts that already passed some fit threshold.</p>
<p>For example:</p>
<ul>
<li>competitor customer</li>
<li>decent headcount band</li>
<li>recent public updates</li>
<li>category relevance from the source chain</li>
</ul>
<p>Do that first. Then go looking for humans.</p>
<h3 id="pull-role-alike-people">Pull role-alike people</h3>
<p>Use the Similar People endpoint.</p>
<pre><code class="language-python">class ProspectPerson(BaseModel):
    account_domain: str
    full_name: str | None = None
    role: str | None = None
    work_email: str | None = None
    x_handle: str | None = None
    score: float = 0.0
</code></pre>
<pre><code class="language-python">def find_similar_people(api_client, employer_website: str, role: str):
    api = ninjapear.EmployeeAPIApi(api_client)
    return api.get_similar_people(employer_website=employer_website, role=role)
</code></pre>
<p>If I were building this for a payments-adjacent product, I would start with one clean role like <code>Head of Revenue Operations</code> or <code>VP Sales Operations</code>.</p>
<p>Sample response shape:</p>
<pre><code class="language-json">{
  &quot;results&quot;: [
    {
      &quot;full_name&quot;: &quot;Jane Doe&quot;,
      &quot;role&quot;: &quot;Head of Revenue Operations&quot;,
      &quot;work_email&quot;: &quot;[email protected]&quot;,
      &quot;x_handle&quot;: &quot;janedoe&quot;,
      &quot;x_profile_url&quot;: &quot;https://x.com/janedoe&quot;,
      &quot;employer_website&quot;: &quot;https://shopify.com&quot;
    },
    {
      &quot;full_name&quot;: &quot;Alex Kim&quot;,
      &quot;role&quot;: &quot;VP Sales Operations&quot;,
      &quot;work_email&quot;: null,
      &quot;x_handle&quot;: null,
      &quot;x_profile_url&quot;: null,
      &quot;employer_website&quot;: &quot;https://www.apple.com&quot;
    }
  ]
}
</code></pre>
<h3 id="enrich-the-person-record">Enrich the person record</h3>
<p>Then use the Person Profile endpoint.</p>
<p>It can resolve from:</p>
<ul>
<li>work email</li>
<li>name + company</li>
<li>role + company</li>
</ul>
<p>NinjaPear’s published match-rate guidance is useful:</p>
<table>
<thead>
<tr>
<th>Input method</th>
<th style="text-align: right;">Profiles found</th>
<th style="text-align: right;">Accuracy</th>
</tr>
</thead>
<tbody>
<tr>
<td>Work email</td>
<td style="text-align: right;">10/10</td>
<td style="text-align: right;">100%</td>
</tr>
<tr>
<td>First name + last name + company</td>
<td style="text-align: right;">9/10</td>
<td style="text-align: right;">90%</td>
</tr>
<tr>
<td>Role + company</td>
<td style="text-align: right;">7/10</td>
<td style="text-align: right;">70%</td>
</tr>
</tbody>
</table>
<p>Wrapper:</p>
<pre><code class="language-python">def get_person_profile(api_client, work_email=None, employer_website=None, role=None, first_name=None, last_name=None):
    api = ninjapear.EmployeeAPIApi(api_client)
    return api.get_employee_profile(
        work_email=work_email,
        employer_website=employer_website,
        role=role,
        first_name=first_name,
        last_name=last_name,
    )
</code></pre>
<p>Sample response shape:</p>
<pre><code class="language-json">{
  &quot;id&quot;: &quot;a3xK9mP2&quot;,
  &quot;full_name&quot;: &quot;Patrick Collison&quot;,
  &quot;first_name&quot;: &quot;Patrick&quot;,
  &quot;last_name&quot;: &quot;Collison&quot;,
  &quot;bio&quot;: &quot;Co-founder and CEO of Stripe&quot;,
  &quot;profile_pic_url&quot;: &quot;https://pbs.twimg.com/...&quot;,
  &quot;country&quot;: &quot;IE&quot;,
  &quot;city&quot;: &quot;IELIM&quot;,
  &quot;x_handle&quot;: &quot;patrickc&quot;,
  &quot;x_profile_url&quot;: &quot;https://x.com/patrickc&quot;,
  &quot;personal_website&quot;: &quot;https://patrickcollison.com&quot;,
  &quot;work_experience&quot;: [
    {
      &quot;role&quot;: &quot;Co-founder &amp; CEO&quot;,
      &quot;company_name&quot;: &quot;Stripe&quot;,
      &quot;company_website&quot;: &quot;stripe.com&quot;,
      &quot;start_date&quot;: &quot;2010-01&quot;,
      &quot;end_date&quot;: null
    }
  ],
  &quot;education&quot;: [
    {
      &quot;major&quot;: &quot;B.S. Mathematics&quot;,
      &quot;school&quot;: &quot;MIT&quot;,
      &quot;start_date&quot;: &quot;2006-09&quot;,
      &quot;end_date&quot;: &quot;2009-06&quot;
    }
  ]
}
</code></pre>
<h3 id="build-the-contact-queue">Build the contact queue</h3>
<p>Turn the best accounts into a contact queue.</p>
<pre><code class="language-python">def build_contact_queue(api_client, accounts, target_role=&quot;Head of Revenue Operations&quot;):
    people = []
    for account in accounts:
        if not account.website:
            continue
        payload = find_similar_people(api_client, employer_website=account.website, role=target_role)
        data = payload.to_dict() if hasattr(payload, &quot;to_dict&quot;) else payload
        for item in data.get(&quot;results&quot;, []) or data.get(&quot;people&quot;, []) or []:
            people.append(
                ProspectPerson(
                    account_domain=normalize_domain(account.website),
                    full_name=item.get(&quot;full_name&quot;),
                    role=item.get(&quot;role&quot;),
                    work_email=item.get(&quot;work_email&quot;),
                    x_handle=item.get(&quot;x_handle&quot;),
                )
            )
    return people
</code></pre>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/cursedboy328</span>
<span style="color:#878a8c;">· ▲ 4</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">the "personalization" you're describing isn't personalization though. "loved your mission page" and "saw your recent announcement" is just scraping disguised as relevance. of course that doesn't work</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1rkgmtp/stop_hyperpersonalizing_your_cold_emails/o8kgm8w/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is why people discovery should follow account logic. You want relevance. Not decorative personalization.</p>
<h2 id="loop-4-enrich-and-monitor">Loop 4: Enrich and monitor</h2>
<p>If your workflow has no timing layer, it is not agentic lead generation. It is a nicer spreadsheet.</p>
<h3 id="enrich-the-account">Enrich the account</h3>
<p>Use these NinjaPear endpoints:</p>
<ul>
<li><a href="https://nubela.co/?ref=nubela.co">Company Details</a> for context</li>
<li>Employee Count for fit and segmentation</li>
<li>Company Funding for capital signal</li>
<li><a href="https://nubela.co/company-monitor?ref=nubela.co">Company Monitor</a> and Company Updates for recent public changes</li>
</ul>
<p>Endpoint map:</p>
<table>
<thead>
<tr>
<th>Endpoint</th>
<th>Purpose</th>
<th>Loop</th>
</tr>
</thead>
<tbody>
<tr>
<td>Customer Listing</td>
<td>Pull customers, investors, partners</td>
<td>Loop 1</td>
</tr>
<tr>
<td>Competitor Listing</td>
<td>Expand market graph</td>
<td>Loop 2</td>
</tr>
<tr>
<td>Similar People</td>
<td>Find role-alike contacts</td>
<td>Loop 3</td>
</tr>
<tr>
<td>Person Profile</td>
<td>Enrich target person</td>
<td>Loop 3</td>
</tr>
<tr>
<td>Company Details</td>
<td>Add firmographic and narrative context</td>
<td>Loop 4</td>
</tr>
<tr>
<td>Employee Count</td>
<td>Fit and segment by size</td>
<td>Loop 4</td>
</tr>
<tr>
<td>Company Funding</td>
<td>Detect capital signal</td>
<td>Loop 4</td>
</tr>
<tr>
<td>Company Updates</td>
<td>Detect changes worth acting on</td>
<td>Loop 4</td>
</tr>
<tr>
<td>Monitor API</td>
<td>Turn updates into an ongoing feed</td>
<td>Loop 4</td>
</tr>
</tbody>
</table>
<p>Wrappers:</p>
<pre><code class="language-python">def get_company_details(api_client, website: str):
    api = ninjapear.CompanyAPIApi(api_client)
    return api.get_company_details(website=website)


def get_employee_count(api_client, website: str):
    api = ninjapear.CompanyAPIApi(api_client)
    return api.get_employee_count(website=website)


def get_company_updates(api_client, website: str):
    api = ninjapear.CompanyAPIApi(api_client)
    return api.get_company_updates(website=website)
</code></pre>
<p>Sample <code>Company Details</code> shape:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Stripe&quot;,
  &quot;website&quot;: &quot;https://stripe.com&quot;,
  &quot;description&quot;: &quot;Financial infrastructure platform for businesses.&quot;,
  &quot;industry&quot;: 40205020,
  &quot;specialties&quot;: [&quot;payments&quot;, &quot;billing&quot;, &quot;fraud prevention&quot;],
  &quot;x_profile&quot;: &quot;https://x.com/stripe&quot;
}
</code></pre>
<p>Sample <code>Employee Count</code> shape:</p>
<pre><code class="language-json">{
  &quot;website&quot;: &quot;https://stripe.com&quot;,
  &quot;employee_count&quot;: 8000
}
</code></pre>
<p>Sample <code>Company Funding</code> shape:</p>
<pre><code class="language-json">{
  &quot;company_name&quot;: &quot;Stripe&quot;,
  &quot;funding_rounds&quot;: [
    {
      &quot;round_type&quot;: &quot;Series H&quot;,
      &quot;announced_date&quot;: &quot;2023-03-15&quot;,
      &quot;money_raised&quot;: 6500000000,
      &quot;lead_investors&quot;: [&quot;Andreessen Horowitz&quot;]
    }
  ]
}
</code></pre>
<h3 id="add-company-changes">Add company changes</h3>
<p>This is where the system gets its timing.</p>
<p>NinjaPear’s update model covers:</p>
<ul>
<li>blog posts</li>
<li>X posts</li>
<li>meaningful website changes</li>
</ul>
<p>And the output can be consumed as RSS. That part matters because it means you can push it into Slack, a CRM worker, or your own queue without much glue.</p>
<p>Sample <code>Company Updates</code> response shape:</p>
<pre><code class="language-json">{
  &quot;updates&quot;: [
    {
      &quot;title&quot;: &quot;New Checkout Experience for Global Payments&quot;,
      &quot;category&quot;: &quot;blog&quot;,
      &quot;summary&quot;: &quot;Stripe announced a new checkout experience focused on international merchants.&quot;,
      &quot;link&quot;: &quot;https://stripe.com/blog/new-checkout&quot;,
      &quot;published_at&quot;: &quot;2026-02-27T10:00:00Z&quot;
    },
    {
      &quot;title&quot;: &quot;Pricing page updated, new Enterprise tier added&quot;,
      &quot;category&quot;: &quot;website update&quot;,
      &quot;summary&quot;: &quot;A new enterprise pricing tier was detected on the public pricing page.&quot;,
      &quot;link&quot;: &quot;https://stripe.com/pricing&quot;,
      &quot;published_at&quot;: &quot;2026-02-27T07:00:00Z&quot;
    },
    {
      &quot;title&quot;: &quot;We just launched Stripe Billing v3&quot;,
      &quot;category&quot;: &quot;x&quot;,
      &quot;summary&quot;: &quot;Product launch announcement on X.&quot;,
      &quot;link&quot;: &quot;https://x.com/stripe/status/1839200000000000000&quot;,
      &quot;published_at&quot;: &quot;2026-02-26T14:30:00Z&quot;
    }
  ]
}
</code></pre>
<p>The published pricing examples for monitoring are a good sanity check:</p>
<table>
<thead>
<tr>
<th>Scenario</th>
<th style="text-align: right;">Targets</th>
<th>Frequency</th>
<th style="text-align: right;">Credits/month</th>
</tr>
</thead>
<tbody>
<tr>
<td>VC tracking portfolio</td>
<td style="text-align: right;">20</td>
<td>Weekly</td>
<td style="text-align: right;">~346</td>
</tr>
<tr>
<td>Startup monitoring competitors</td>
<td style="text-align: right;">10</td>
<td>Daily</td>
<td style="text-align: right;">~1,203</td>
</tr>
<tr>
<td>Sales team watching prospect accounts</td>
<td style="text-align: right;">5</td>
<td>Daily</td>
<td style="text-align: right;">~453</td>
</tr>
</tbody>
</table>
<p>That is enough to test timing-based lead generation without turning it into a big budget exercise.</p>
<h3 id="set-up-monitoring">Set up monitoring</h3>
<p>Keep the wrapper thin:</p>
<pre><code class="language-python">def create_monitor_feed(api_client, websites: list[str], frequency: str = &quot;daily&quot;):
    api = ninjapear.CompanyAPIApi(api_client)
    return api.create_monitor_feed({&quot;targets&quot;: websites, &quot;frequency&quot;: frequency})
</code></pre>
<p>Sample monitor response shape:</p>
<pre><code class="language-json">{
  &quot;rss_feed_url&quot;: &quot;https://nubela.co/api/v1/monitor/feed/demo-stripe.xml&quot;,
  &quot;targets&quot;: [
    &quot;https://stripe.com&quot;,
    &quot;https://shopify.com&quot;
  ],
  &quot;frequency&quot;: &quot;daily&quot;
}
</code></pre>
<h3 id="build-a-score">Build a score</h3>
<p>Start with a plain scoring function.</p>
<pre><code class="language-python">def score_account(is_competitor_customer: bool, employee_count: int | None, recent_updates: int, role_match: bool) -&gt; float:
    score = 0.0
    if is_competitor_customer:
        score += 40
    if employee_count and 50 &lt;= employee_count &lt;= 2000:
        score += 20
    score += min(recent_updates * 10, 20)
    if role_match:
        score += 20
    return score
</code></pre>
<p>Signal table:</p>
<table>
<thead>
<tr>
<th>Output signal</th>
<th style="text-align: right;">Scoring impact</th>
<th>Why it matters</th>
</tr>
</thead>
<tbody>
<tr>
<td>Competitor customer</td>
<td style="text-align: right;">+40</td>
<td>Strongest evidence of category demand</td>
</tr>
<tr>
<td>Employee count in target band</td>
<td style="text-align: right;">+20</td>
<td>Filters out bad-fit tiny and giant accounts</td>
</tr>
<tr>
<td>Recent updates</td>
<td style="text-align: right;">up to +20</td>
<td>Improves timing and relevance</td>
</tr>
<tr>
<td>Role match found</td>
<td style="text-align: right;">+20</td>
<td>Confirms a likely route to action</td>
</tr>
</tbody>
</table>
<p>Optional person score:</p>
<pre><code class="language-python">def score_person(person: ProspectPerson, account: ProspectAccount) -&gt; float:
    score = 0.0
    if person.role and any(k in person.role.lower() for k in ['revenue', 'sales', 'marketing', 'growth', 'operations']):
        score += 40
    if person.work_email:
        score += 20
    if person.x_handle:
        score += 10
    score += min(account.score / 3, 30)
    return round(score, 2)
</code></pre>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/cursedboy328</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">depends on the vertical honestly. for saas we lean heavy on hiring signals ... the meta-pattern is: whatever signal proves they're spending money on the problem you solve.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1rkgmtp/stop_hyperpersonalizing_your_cold_emails/o8to0wb/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is basically the timing argument in one comment.</p>
<h2 id="wire-the-pydanticai-agent">Wire the PydanticAI agent</h2>
<p>You do not need a full PydanticAI tutorial here. You need enough to keep orchestration typed and in one place.</p>
<p>Typed output model:</p>
<pre><code class="language-python">from pydantic import BaseModel

class LeadGenResult(BaseModel):
    accounts: list[ProspectAccount]
    people: list[ProspectPerson]
    summary: str
</code></pre>
<p>Agent initialization:</p>
<pre><code class="language-python">from pydantic_ai import Agent
from pydantic_ai.models.openrouter import OpenRouterModel
from pydantic_ai.providers.openrouter import OpenRouterProvider

model = OpenRouterModel(
    settings.openrouter_model,
    provider=OpenRouterProvider(api_key=settings.openrouter_api_key),
)

agent = Agent(
    model,
    output_type=LeadGenResult,
    system_prompt=&quot;Build an agentic lead generation queue using NinjaPear data and return typed results only.&quot;,
)
</code></pre>
<p>Tool-wrapped workflow:</p>
<pre><code class="language-python">from pydantic_ai import RunContext

@agent.tool
async def build_queue(ctx: RunContext[AgentDeps], seeds: list[str], target_role: str = &quot;Head of Revenue Operations&quot;) -&gt; dict:
    with make_client(ctx.deps.settings.ninjapear_api_key) as api_client:
        result = run_pipeline(api_client, seeds=seeds, target_role=target_role)
    return result.model_dump()
</code></pre>
<p>That is enough structure for a useful agent.</p>
<h2 id="add-ninjapear-tools">Add NinjaPear tools</h2>
<p>This is the bridge between docs and working code.</p>
<p>I would put the wrappers in <code>app/tools/ninjapear.py</code>.</p>
<p>Required wrappers:</p>
<ul>
<li><code>get_customer_listing</code></li>
<li><code>get_competitors</code></li>
<li><code>get_company_details</code></li>
<li><code>get_employee_count</code></li>
<li><code>get_company_updates</code></li>
<li><code>get_company_funding</code></li>
<li><code>get_person_profile</code></li>
<li><code>find_similar_people</code></li>
<li><code>create_monitor_feed</code></li>
</ul>
<p>Rule of thumb:</p>
<ul>
<li>NinjaPear code should be real</li>
<li>non-NinjaPear helpers should be mocked explicitly</li>
</ul>
<p>Model table:</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Fields</th>
<th>Why it exists</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ProspectAccount</code></td>
<td>source, relationship, website, description, specialties, score</td>
<td>Ranked account object for the queue</td>
</tr>
<tr>
<td><code>ProspectPerson</code></td>
<td>domain, name, role, email, X handle, score</td>
<td>Human routing layer after account qualification</td>
</tr>
<tr>
<td><code>CompanyUpdate</code></td>
<td>title, category, summary, link, date</td>
<td>Timing signal for recency-based prioritization</td>
</tr>
<tr>
<td><code>LeadGenResult</code></td>
<td>accounts, people, summary</td>
<td>Typed output for the agent and CLI</td>
</tr>
</tbody>
</table>
<p>Mocked helpers:</p>
<pre><code class="language-python">def verify_email(email: str) -&gt; dict:
    return {
        &quot;email&quot;: email,
        &quot;is_valid&quot;: email.endswith(&quot;@example.com&quot;) is False,
        &quot;provider&quot;: &quot;mock&quot;,
    }


def send_email(to: str, subject: str, body: str) -&gt; dict:
    return {
        &quot;to&quot;: to,
        &quot;subject&quot;: subject,
        &quot;status&quot;: &quot;mocked-not-sent&quot;,
    }
</code></pre>
<p>Be explicit about mocks. It keeps the system honest.</p>
<h2 id="build-the-full-github-project">Build the full GitHub project</h2>
<p>The repo for this guide should live at the root, not inside a wrapper folder. The <code>README.md</code> should also link back to the article.</p>
<p>Repo tree:</p>
<pre><code class="language-text">agentic-lead-generation/
├── README.md
├── .env.example
├── requirements.txt
├── app/
│   ├── config.py
│   ├── models.py
│   ├── main.py
│   ├── scoring.py
│   ├── tools/
│   │   ├── ninjapear.py
│   │   └── mock_email.py
│   └── workflows/
│       └── pipeline.py
└── examples/
    └── run_demo.py
</code></pre>
<p>A few short excerpts.</p>
<p><code>config.py</code></p>
<pre><code class="language-python">class Settings(BaseModel):
    ninjapear_api_key: str = Field(..., alias='NINJAPEAR_API_KEY')
    openrouter_api_key: str = Field(..., alias='OPENROUTER_API_KEY')
    openrouter_model: str = Field(default='anthropic/claude-sonnet-4-5', alias='OPENROUTER_MODEL')
</code></pre>
<p><code>models.py</code></p>
<pre><code class="language-python">class ProspectAccount(BaseModel):
    source_company: str
    relationship_type: Literal['customer', 'investor', 'partner_platform', 'competitor']
    website: str | None = None
    normalized_domain: str | None = None
    name: str
    score: float = 0.0
</code></pre>
<p><code>tools/ninjapear.py</code></p>
<pre><code class="language-python">def make_client(api_key: str):
    configuration = ninjapear.Configuration(host='https://nubela.co', access_token=api_key)
    return ninjapear.ApiClient(configuration)
</code></pre>
<p><code>scoring.py</code></p>
<pre><code class="language-python">def score_account(is_competitor_customer: bool, employee_count: int | None, recent_updates: int, role_match: bool) -&gt; float:
    score = 0.0
    if is_competitor_customer:
        score += 40
</code></pre>
<p><code>workflows/pipeline.py</code></p>
<pre><code class="language-python">def run_pipeline(api_client, seeds: list[str], target_role: str = 'Head of Revenue Operations') -&gt; LeadGenResult:
    accounts = pull_competitor_customers(api_client, seeds)
    competitors = expand_competitors(api_client, seeds, max_depth=1)
</code></pre>
<p><code>main.py</code></p>
<pre><code class="language-python">result = agent.run_sync(
    'Build the lead generation queue for Stripe and Shopify competitors.',
    deps=AgentDeps(settings=settings)
)
</code></pre>
<p><code>examples/run_demo.py</code></p>
<pre><code class="language-python">result = run_pipeline(
    api_client,
    seeds=['https://stripe.com', 'https://shopify.com'],
    target_role='Head of Revenue Operations',
)
</code></pre>
<p>That repo is the lead magnet here. That is the asset people actually want.</p>
<h2 id="run-an-end-to-end-example">Run an end-to-end example</h2>
<p>Now run the workflow from the perspective of a founder using Stripe and Shopify as the wedge.</p>
<p>Input:</p>
<pre><code class="language-python">seeds = [&quot;https://stripe.com&quot;, &quot;https://shopify.com&quot;]
target_role = &quot;Head of Revenue Operations&quot;
</code></pre>
<p>Runnable demo shape:</p>
<pre><code class="language-python">from app.config import Settings
from app.tools.ninjapear import make_client
from app.workflows.pipeline import run_pipeline


def main():
    settings = Settings.from_env()
    with make_client(settings.ninjapear_api_key) as api_client:
        result = run_pipeline(
            api_client,
            seeds=['https://stripe.com', 'https://shopify.com'],
            target_role='Head of Revenue Operations',
        )
    print(result.model_dump_json(indent=2))
</code></pre>
<p>What happens:</p>
<ol>
<li>Pull customer lists for Stripe and Shopify.</li>
<li>Expand the competitor graph by one layer.</li>
<li>Re-run customer pull on selected adjacent competitors.</li>
<li>Keep top accounts.</li>
<li>Find similar people at those accounts.</li>
<li>Enrich with headcount and updates.</li>
<li>Score and rank.</li>
</ol>
<p>Representative intermediate account output after Loop 1:</p>
<pre><code class="language-json">[
  {
    &quot;source_company&quot;: &quot;https://stripe.com&quot;,
    &quot;relationship_type&quot;: &quot;customer&quot;,
    &quot;name&quot;: &quot;Apple&quot;,
    &quot;website&quot;: &quot;https://www.apple.com&quot;,
    &quot;normalized_domain&quot;: &quot;apple.com&quot;,
    &quot;description&quot;: &quot;Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide.&quot;,
    &quot;score&quot;: 0
  },
  {
    &quot;source_company&quot;: &quot;https://shopify.com&quot;,
    &quot;relationship_type&quot;: &quot;customer&quot;,
    &quot;name&quot;: &quot;Toyota&quot;,
    &quot;website&quot;: &quot;https://toyota.com&quot;,
    &quot;normalized_domain&quot;: &quot;toyota.com&quot;,
    &quot;description&quot;: &quot;Global automotive manufacturer.&quot;,
    &quot;score&quot;: 0
  }
]
</code></pre>
<p>Representative intermediate people output after Loop 3:</p>
<pre><code class="language-json">[
  {
    &quot;account_domain&quot;: &quot;shopify.com&quot;,
    &quot;full_name&quot;: &quot;Jane Doe&quot;,
    &quot;role&quot;: &quot;Head of Revenue Operations&quot;,
    &quot;work_email&quot;: &quot;[email protected]&quot;,
    &quot;x_handle&quot;: &quot;janedoe&quot;,
    &quot;score&quot;: 0
  }
]
</code></pre>
<p>Representative final JSON shape:</p>
<pre><code class="language-json">{
  &quot;accounts&quot;: [
    {
      &quot;website&quot;: &quot;https://example.com&quot;,
      &quot;source_company&quot;: &quot;https://stripe.com&quot;,
      &quot;relationship_type&quot;: &quot;customer&quot;,
      &quot;score&quot;: 78
    }
  ],
  &quot;people&quot;: [
    {
      &quot;full_name&quot;: &quot;Jane Doe&quot;,
      &quot;role&quot;: &quot;Head of Revenue Operations&quot;,
      &quot;account_domain&quot;: &quot;example.com&quot;
    }
  ],
  &quot;summary&quot;: &quot;Found 14 high-fit accounts and 9 likely buyer profiles from 2 seed competitors.&quot;
}
</code></pre>
<p>If you want to generate an outreach task after that, fine. Just keep email sending mocked until the queue quality is real.</p>
<h2 id="use-the-ninjapear-skill">Use the NinjaPear Skill</h2>
<p>If you already use an AI coding agent, install the NinjaPear Skill first.</p>
<p>It teaches the agent the boring parts that people usually get wrong:</p>
<ul>
<li>auth setup</li>
<li>endpoint selection with cost awareness</li>
<li>Python and JavaScript SDK usage</li>
<li>pagination handling</li>
<li>rate limit handling</li>
<li>error handling for <code>401</code>, <code>403</code>, <code>404</code>, <code>429</code>, <code>500</code>, <code>503</code></li>
<li>timeout configuration</li>
</ul>
<p>Install commands:</p>
<pre><code class="language-bash">npx skills add NinjaPear/ninjapear-skill -a claude-code
npx skills add NinjaPear/ninjapear-skill -a codex
npx skills add NinjaPear/ninjapear-skill -a opencode
</code></pre>
<p>That is useful here because the whole point of this guide is to build an agentic lead generation system that actually ships.</p>
<p>Most lead generation articles still explain funnels to people who need systems.</p>
<p>This is the simpler frame I would use instead:</p>
<ol>
<li><strong>Who is already buying in the category?</strong></li>
<li><strong>Which adjacent accounts should I care about next?</strong></li>
<li><strong>Which humans are worth routing to?</strong></li>
<li><strong>Why is now the right moment?</strong></li>
</ol>
<p>If your stack cannot answer all four, your agentic lead generation setup is mostly branding.</p>
<p>So the next step is simple. Clone the repo, plug in your API keys, and run it against two competitors you already know. Start with Stripe and Shopify if you want the exact wedge from this guide.</p>
<p>And if you are building with Claude Code, Codex, or Opencode, install the NinjaPear Skill before you touch the code. It will save you time on auth, pagination, and endpoint selection.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ TruePeopleSearch Review 2026: My Verdict as CEO + FREE data removal tracker download ]]></title>
        <description><![CDATA[ If you searched true people search because you want the fast answer, here it is: yes, it works for quick lookups, and no, I would not trust it for anything important. The useful part is real. The privacy tradeoff is real too.







r/privacy
u/rockhardpebble0
· ▲ 28



No idea how ]]></description>
        <link>https://nubela.co/blog/truepeoplesearch-review/</link>
        <guid isPermaLink="false">69e03ff544d9df00016fef6c</guid>
        <category><![CDATA[ true people search ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Thu, 16 Apr 2026 09:48:40 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you searched <strong>true people search</strong> because you want the fast answer, here it is: yes, it works for quick lookups, and no, I would not trust it for anything important. The useful part is real. The privacy tradeoff is real too.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/privacy</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/rockhardpebble0</span>
<span style="color:#878a8c;">· ▲ 28</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">No idea how I ended up in true people search but they have my information with location and addresses. I have no idea how this site is even legal you can see people's PII just by name, number, address or email insane. I have tried 7 times so far with the removal request but no luck.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/privacy/comments/1at4xeh/how_do_you_get_your_data_off_true_people_search/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Data Broker Opt-Out Tracker + 90-Day Recheck Checklist</strong><br>
<span style="color:#555;">A practical tracker for removal requests, confirmation emails, expected removal dates, and 90-day rechecks across the broker sites that matter.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/_bundle-ba713bf6.zip?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="tldr">TL;DR</h2>
<table>
<thead>
<tr>
<th>Factor</th>
<th>TruePeopleSearch</th>
<th>FastPeopleSearch</th>
<th>Whitepages</th>
<th>Spokeo</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free lookup depth</td>
<td>Strong</td>
<td>Strong</td>
<td>Limited</td>
<td>Limited</td>
<td>TruePeopleSearch / FastPeopleSearch</td>
</tr>
<tr>
<td>Search speed</td>
<td>Fast</td>
<td>Fast</td>
<td>Fast</td>
<td>Medium</td>
<td>TruePeopleSearch / FastPeopleSearch</td>
</tr>
<tr>
<td>UX clarity</td>
<td>Weak</td>
<td>Weak</td>
<td>Better</td>
<td>Better</td>
<td>Whitepages</td>
</tr>
<tr>
<td>Pricing</td>
<td>Free</td>
<td>Free</td>
<td>Mixed paid layers</td>
<td>Paid reports</td>
<td>TruePeopleSearch / FastPeopleSearch</td>
</tr>
<tr>
<td>Privacy posture</td>
<td>Poor</td>
<td>Poor</td>
<td>Better documented</td>
<td>Middling</td>
<td>Whitepages</td>
</tr>
<tr>
<td>Reverse phone lookup</td>
<td>Strong</td>
<td>Strong</td>
<td>Decent</td>
<td>Decent</td>
<td>TruePeopleSearch / FastPeopleSearch</td>
</tr>
<tr>
<td>High-stakes verification</td>
<td>No</td>
<td>No</td>
<td>Better, still imperfect</td>
<td>Better, still imperfect</td>
<td>None</td>
</tr>
<tr>
<td>Professional/company research</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.1/5</strong></td>
<td><strong>3.0/5</strong></td>
<td><strong>3.4/5</strong></td>
<td><strong>3.2/5</strong></td>
<td><strong>Whitepages</strong> for polish / <strong>TruePeopleSearch</strong> for free utility</td>
</tr>
</tbody>
</table>
<h2 id="my-blunt-take">My blunt take</h2>
<p>TruePeopleSearch is useful.</p>
<p>That is the first thing to say. If you need to identify a spam caller, check an old address trail, or find someone from partial info, it can be faster than the prettier sites.</p>
<p>It is also the kind of tool that changes character when you search yourself. Then it stops being a lookup tool and starts feeling like a public directory of things most people assumed were harder to find.</p>
<p>That is my verdict on <strong>true people search</strong> in one sentence: good for casual lookups, bad as a source of truth, and worth opting out of if your own record is there.</p>
<h3 id="the-one-line-verdict">The one-line verdict</h3>
<ul>
<li><strong>Use it</strong> for fast, casual, one-off lookups.</li>
<li><strong>Do not trust it</strong> for high-stakes verification.</li>
<li><strong>Do not use it</strong> for employment, tenant, or compliance-sensitive screening.</li>
<li><strong>If your profile is on it, remove it now.</strong></li>
</ul>
<h2 id="what-truepeoplesearch-gives-you-for-free">What TruePeopleSearch gives you for free</h2>
<p>This part is straightforward.</p>
<p>The official Google Play listing says TruePeopleSearch is a free people search service with updated records on nearly every adult in the US. It says you can get full address histories, phone numbers, email addresses, relatives, friends, associates, property information, and more.</p>
<p>In practical terms, that means:</p>
<ul>
<li>name search</li>
<li>reverse phone lookup</li>
<li>reverse address lookup</li>
<li>current and past addresses</li>
<li>phone numbers</li>
<li>relatives and associates</li>
<li>possible email addresses</li>
<li>possible property information</li>
<li>possible business listings</li>
</ul>
<p>That is why people use it. Not because it is elegant. Because it is useful in the narrow way these tools are useful.</p>
<p>If your problem is “who keeps calling me from this number,” it can help.</p>
<p>If your problem is “I need a reliable answer for a decision that matters,” it cannot.</p>
<h3 id="what-100-free-means">What “100% free” means</h3>
<p>The best explanation comes from the app listing itself:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border:1px solid #cfd9de;padding:16px;margin:16px 0;border-radius:12px;font-family:-apple-system,sans-serif;max-width:550px;background:#fff;">
  <div style="display:flex;align-items:center;margin-bottom:8px;">
    <div>
      <strong style="font-size:15px;">Google Play listing</strong>
      <span style="color:#536471;font-size:14px;"> TruePeopleSearch app description</span>
    </div>
  </div>
  <div style="font-size:15px;line-height:1.5;margin-bottom:8px;">Our content is 100% free, however this app contains ads that will send you to paid services if you click on them. Ads are labeled with 'ad', 'sponsored links' etc.</div>
  <div style="color:#536471;font-size:13px;">Public product description</div>
  <a href="https://play.google.com/store/apps/details?id=com.freedataservices.truepeoplesearch&hl=en_US&ref=nubela.co" style="color:#536471;font-size:12px;">Source</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is honest enough.</p>
<p>The searches are free. The experience is still monetized. You are not paying with a card, but you are absolutely moving through an ad-supported funnel.</p>
<p>This is why I do not buy the phrase “100% free” at face value. It is true in the narrow sense. It is incomplete in the practical sense.</p>
<h2 id="scorecard-truepeoplesearch-vs-alternatives">Scorecard: TruePeopleSearch vs alternatives</h2>
<p>I do not care much about who has the nicest homepage. I care about whether a tool gives me useful information with minimal nonsense.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Data Richness</th>
<th>Freshness</th>
<th>Search Speed</th>
<th>Pricing</th>
<th>UX Clarity</th>
<th>Privacy Posture</th>
<th>Mobile Experience</th>
<th>Trustworthiness</th>
<th>Overall</th>
</tr>
</thead>
<tbody>
<tr>
<td>TruePeopleSearch</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐★★★★</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td><strong>3.1/5</strong></td>
</tr>
<tr>
<td>FastPeopleSearch</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐★★★★</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td><strong>3.0/5</strong></td>
</tr>
<tr>
<td>Whitepages</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td>Spokeo</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.2/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="my-rubric">My rubric</h3>
<ul>
<li><strong>Freshness</strong>: whether moved addresses and changed numbers seem to be reflected.</li>
<li><strong>Richness</strong>: how much you get before a paywall.</li>
<li><strong>UX clarity</strong>: whether you can get where you need to go without sidestepping ads.</li>
<li><strong>Privacy posture</strong>: whether opt-out is understandable and whether re-checking is clearly necessary.</li>
<li><strong>Trustworthiness</strong>: whether the site feels like it is helping you or steering you.</li>
</ul>
<p>That last one matters.</p>
<p>People-search sites already start from a trust deficit. A bad interface makes it worse.</p>
<h2 id="the-privacy-tradeoff-is-the-product">The privacy tradeoff is the product</h2>
<p>This is the center of the whole thing.</p>
<p>TruePeopleSearch is useful because it aggregates details people do not expect to be aggregated so cleanly. Current and past addresses. Phone numbers. Relatives. Associates. Sometimes property context.</p>
<p>That is the feature.</p>
<p>It is also the reason people search themselves once and decide they want out.</p>
<p>Incogni’s 2025 removal guide says removals usually work within <strong>24 to 72 hours</strong>, but also says listings may reappear as public records refresh. That caveat matters more than the initial removal flow.</p>
<p>It means removal is not really an event. It is maintenance.</p>
<h3 id="what-users-are-upset-about">What users are upset about</h3>
<p>People are not upset because the font is bad.</p>
<p>They are upset because their address is online.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/privacy</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/rockhardpebble0</span>
<span style="color:#878a8c;">· ▲ 28</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">No idea how I ended up in true people search but they have my information with location and addresses. I have no idea how this site is even legal you can see people's PII just by name, number, address or email insane.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/privacy/comments/1at4xeh/how_do_you_get_your_data_off_true_people_search/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/privacy</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Eco_84</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">https://www.truepeoplesearch.com/removal ... They might, I'm not sure, be using People Connect for data. Get off the big sites and see if the True People Search idiots take your information down in routine updates.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/privacy/comments/1at4xeh/how_do_you_get_your_data_off_true_people_search/kt8vjgq/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>And the category-level fear is not hard to find on X either:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Your full name, home city, phone number, and relatives are on at least 47 websites right now.

Free to view. Free to download. Free to use against you.

🧵 Here are the exact steps to DELETE YOUR DIGITAL FOOTPRINT</p>&mdash; Kanika (@KanikaBK) <a href="https://x.com/KanikaBK/status/2043744028991336935?ref=nubela.co">Mon Apr 13 17:32:02 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That is enough to explain the economics.</p>
<p>The lookup is free because the data is visible enough to make the site useful, and the site is useful enough to attract attention and ad clicks.</p>
<h2 id="how-the-truepeoplesearch-opt-out-works">How the TruePeopleSearch opt-out works</h2>
<p>The removal flow is not technically hard.</p>
<p>It is just annoying in the specific ways that data-broker opt-outs are annoying.</p>
<p>Core flow:</p>
<ol>
<li>Go to <code>https://www.truepeoplesearch.com/removal</code></li>
<li>Enter your email, accept the terms, complete CAPTCHA</li>
<li>Search by full name, city, and state</li>
<li>Find the right listing and open details</li>
<li>Scroll to <strong>Remove This Record</strong></li>
<li>Confirm by email</li>
<li>Re-check after the waiting window</li>
</ol>
<p>Incogni says this process takes <strong>5 to 10 minutes</strong> and usually clears within <strong>24 to 72 hours</strong> if you complete the email confirmation.</p>
<p>I also hit a Cloudflare block trying to access the removal page during testing.</p>
<p><img alt="TruePeopleSearch removal page blocked during testing" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e090d3d346ce.webp" /></p>
<p>That is worth mentioning because it adds friction right at the start.</p>
<h3 id="friction-points">Friction points</h3>
<p>These are the things that actually waste time:</p>
<ul>
<li>common names create multiple candidate records</li>
<li>confirmation emails may land in spam</li>
<li>session expiry can happen during the process</li>
<li>multiple records need separate removals</li>
<li>listings may come back when public records refresh</li>
<li>access can fail before you even start</li>
</ul>
<p>This is why I do not think of opt-out as a button. I think of it as a queue of small tasks.</p>
<h3 id="a-better-removal-procedure">A better removal procedure</h3>
<p>If you want this to stick as well as it can, use a system.</p>
<ol>
<li>Use a dedicated email inbox for removals.</li>
<li>Search current and past cities and states.</li>
<li>Log every matching listing.</li>
<li>Confirm each email immediately.</li>
<li>Re-check after 72 hours.</li>
<li>Re-check again after 30 days.</li>
<li>Put a 90-day reminder on your calendar.</li>
<li>Repeat the process on adjacent brokers.</li>
</ol>
<p>That sounds boring because it is boring.</p>
<p>It also works better than improvising.</p>
<p>Here is a basic tracker layout:</p>
<table>
<thead>
<tr>
<th>Site name</th>
<th>Listing URL</th>
<th>Date submitted</th>
<th>Confirmation email received</th>
<th>Status</th>
<th>Expected removal date</th>
<th>Recheck date</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>TruePeopleSearch</td>
<td>pasted URL</td>
<td>2026-04-01</td>
<td>Yes</td>
<td>Pending</td>
<td>2026-04-04</td>
<td>2026-05-01</td>
<td>2 records found</td>
</tr>
<tr>
<td>FastPeopleSearch</td>
<td>pasted URL</td>
<td>2026-04-01</td>
<td>Yes</td>
<td>Pending</td>
<td>2026-04-04</td>
<td>2026-05-01</td>
<td>old address still live</td>
</tr>
<tr>
<td>Whitepages</td>
<td>pasted URL</td>
<td>2026-04-01</td>
<td>No</td>
<td>In progress</td>
<td></td>
<td>2026-04-08</td>
<td>check spam</td>
</tr>
</tbody>
</table>
<h2 id="alternatives-by-job">Alternatives by job</h2>
<p>Most of the internet writes “alternatives” like an affiliate spreadsheet. That is not helpful.</p>
<p>The only useful way to compare these tools is by job.</p>
<h3 id="fastpeoplesearch-vs-truepeoplesearch">FastPeopleSearch vs TruePeopleSearch</h3>
<p>These two are very close.</p>
<p>Both are good at:</p>
<ul>
<li>quick name lookups</li>
<li>reverse phone checks</li>
<li>showing more than you expected for free</li>
</ul>
<p>Both are bad at:</p>
<ul>
<li>trust-building interface design</li>
<li>clear privacy posture</li>
<li>making opt-out feel like part of the product instead of a legal obligation</li>
</ul>
<p>If TruePeopleSearch does not give me what I want, FastPeopleSearch is the next tab.</p>
<p>That is the relationship.</p>
<h3 id="whitepages-vs-truepeoplesearch">Whitepages vs TruePeopleSearch</h3>
<p>This one is simpler.</p>
<p>TruePeopleSearch usually shows more for free. Whitepages is cleaner.</p>
<p>That is the trade.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>TruePeopleSearch</th>
<th>Whitepages</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free result depth</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>TruePeopleSearch</td>
</tr>
<tr>
<td>UX clarity</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Whitepages</td>
</tr>
<tr>
<td>Pricing transparency</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Whitepages</td>
</tr>
<tr>
<td>Privacy posture</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Whitepages</td>
</tr>
<tr>
<td>Casual one-off utility</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>TruePeopleSearch</td>
</tr>
<tr>
<td>Overall</td>
<td><strong>3.1/5</strong></td>
<td><strong>3.4/5</strong></td>
<td>Whitepages</td>
</tr>
</tbody>
</table>
<p>If I want a free hit, I start with TruePeopleSearch.</p>
<p>If I want a site that feels less chaotic, Whitepages is better.</p>
<h3 id="spokeo-vs-truepeoplesearch">Spokeo vs TruePeopleSearch</h3>
<p>Spokeo makes more sense if you are willing to pay for stitched reports.</p>
<p>It makes less sense if all you want is a fast reverse phone lookup.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>TruePeopleSearch</th>
<th>Spokeo</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free access</td>
<td>⭐★★★★</td>
<td>⭐⭐☆☆☆</td>
<td>TruePeopleSearch</td>
</tr>
<tr>
<td>Paid report depth</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Spokeo</td>
</tr>
<tr>
<td>Search speed</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>TruePeopleSearch</td>
</tr>
<tr>
<td>UX pressure</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Spokeo</td>
</tr>
<tr>
<td>Best for reverse phone quick check</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>TruePeopleSearch</td>
</tr>
<tr>
<td>Overall</td>
<td><strong>3.1/5</strong></td>
<td><strong>3.2/5</strong></td>
<td>Spokeo if paying / TruePeopleSearch if not</td>
</tr>
</tbody>
</table>
<p>So no, Spokeo is not just “better.”</p>
<p>It is better for a different kind of user.</p>
<h3 id="when-ninjapear-fits-instead">When NinjaPear fits instead</h3>
<p>I want to be precise here.</p>
<p>If you are trying to find someone’s home address or personal phone number, NinjaPear is the wrong tool.</p>
<p>If you are trying to research a company executive, enrich an account, identify customers of a business, or monitor company changes, that is where <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> fits.</p>
<p>This is not the same category.</p>
<table>
<thead>
<tr>
<th>Use Case</th>
<th>TruePeopleSearch</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Find someone’s home address</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Reverse personal phone lookup</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Identify a company’s customers</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td>Get a professional profile from work email</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td>Monitor a company’s changes</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td>CRM/account enrichment</td>
<td>No</td>
<td>Yes</td>
</tr>
</tbody>
</table>
<p>Relevant product details from public NinjaPear materials:</p>
<ul>
<li><a href="https://nubela.co/customers?ref=nubela.co">Customer Listing API</a> maps customers, partners, and investors.</li>
<li>NinjaPear says employee profiles are <strong>publicly sourced</strong>.</li>
<li>Its homepage says <strong>Company Details</strong>, <strong>Employee Count</strong>, and <strong>Company Updates</strong> cost <strong>2 credits per call</strong> each.</li>
<li>It explicitly says it does not scrape the major professional social network for these endpoints.</li>
</ul>
<p>That is the distinction that matters.</p>
<p>TruePeopleSearch is consumer people lookup.</p>
<p>NinjaPear is professional and company intelligence.</p>
<h2 id="who-should-use-truepeoplesearch">Who should use TruePeopleSearch</h2>
<h3 id="good-fit">Good fit</h3>
<ul>
<li>someone checking a spam caller</li>
<li>someone doing a one-off lookup</li>
<li>someone checking whether an old address still ties to a person</li>
<li>someone trying to reconnect with an old friend from partial info</li>
</ul>
<h3 id="bad-fit">Bad fit</h3>
<ul>
<li>hiring teams</li>
<li>tenant screening</li>
<li>compliance-sensitive work</li>
<li>journalism or investigations that need confidence</li>
<li>anyone treating “free” as a synonym for “safe” or “complete”</li>
</ul>
<p>If the decision matters, this category is too messy to be the source of truth.</p>
<p>That is the practical rule.</p>
<h2 id="the-bigger-lesson">The bigger lesson</h2>
<p>Free people-search engines are selling a tradeoff.</p>
<p>You are not paying cash for the search. Fine.</p>
<p>But the product still needs a business model, and the business model depends on two things:</p>
<ol>
<li>enough useful personal data to make the lookup worth doing</li>
<li>enough traffic and monetization to keep the machine running</li>
</ol>
<p>That is not a conspiracy theory. It is just the shape of the product.</p>
<p>This is why the same tool can feel useful and invasive at the same time.</p>
<p>It is both.</p>
<h2 id="faq">FAQ</h2>
<h3 id="is-truepeoplesearch-legit">Is TruePeopleSearch legit?</h3>
<p>Yes. It is a real service with a website and Android app. That does not make it reliable enough for serious verification.</p>
<h3 id="is-truepeoplesearch-really-free">Is TruePeopleSearch really free?</h3>
<p>Yes, according to its own listing. It also says the app contains ads and sponsored links that can send users to paid services.</p>
<h3 id="is-truepeoplesearch-safe-to-use">Is TruePeopleSearch safe to use?</h3>
<p>For casual browsing, usually. For serious decisions, no.</p>
<h3 id="how-do-i-remove-my-info-from-truepeoplesearch">How do I remove my info from TruePeopleSearch?</h3>
<p>Go to <code>truepeoplesearch.com/removal</code>, search your record, open the listing, click <strong>Remove This Record</strong>, and confirm by email.</p>
<h3 id="can-my-info-come-back-after-removal">Can my info come back after removal?</h3>
<p>Yes. Incogni says records may reappear as public records refresh.</p>
<h3 id="is-there-a-truepeoplesearch-app">Is there a TruePeopleSearch app?</h3>
<p>Yes. There is an Android app on Google Play.</p>
<h3 id="what-are-the-best-alternatives">What are the best alternatives?</h3>
<p>For consumer lookups: FastPeopleSearch, Whitepages, and Spokeo. For professional or company intelligence: use a purpose-built B2B tool.</p>
<h3 id="is-ninjapear-an-alternative-to-truepeoplesearch">Is NinjaPear an alternative to TruePeopleSearch?</h3>
<p>Not for consumer people search. Yes for professional and company intelligence work.</p>
<h2 id="final-verdict">Final verdict</h2>
<p>Need a quick free lookup? It can help.</p>
<p>Need accuracy you can rely on? No.</p>
<p>Found your own record? Remove it now.</p>
<p>Need B2B professional or company intelligence? Use a tool built for that job instead.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Data Broker Opt-Out Tracker + 90-Day Recheck Checklist</strong><br>
<span style="color:#555;">Use it to track removals, confirmation emails, expected takedown windows, and the 30-day plus 90-day rechecks most people forget.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/_bundle-ba713bf6.zip?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you do one thing after reading this, do not overthink it. Search yourself on TruePeopleSearch. If your record is there, start the opt-out, log it, and put a reminder on your calendar.</p>
<h2 id="sources">Sources</h2>
<ul>
<li>TruePeopleSearch Google Play listing: https://play.google.com/store/apps/details?id=com.freedataservices.truepeoplesearch&amp;hl=en_US</li>
<li>TruePeopleSearch removal page: https://www.truepeoplesearch.com/removal</li>
<li>Incogni TruePeopleSearch opt-out guide: https://blog.incogni.com/true-people-search-removal/</li>
<li>Reddit privacy thread: https://www.reddit.com/r/privacy/comments/1at4xeh/how_do_you_get_your_data_off_true_people_search/</li>
<li>Reddit comment permalink: https://www.reddit.com/r/privacy/comments/1at4xeh/how_do_you_get_your_data_off_true_people_search/kt8vjgq/</li>
<li>X post by Kanika: https://x.com/KanikaBK/status/2043744028991336935</li>
<li>NinjaPear overview: https://nubela.co</li>
<li>NinjaPear Customer Listing API: https://nubela.co/customers</li>
<li>Free download: https://f000.backblazeb2.com/file/agent-pub-filestore/_bundle-ba713bf6.zip</li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Competitor Research Tools in 2026 for CEOs, by a CEO ]]></title>
        <description><![CDATA[ Most competitor research tools lists are useless because they mash five different jobs into one fake category. If you only need keyword overlap, buy an SEO tool. If you need ongoing monitoring, buy a monitor. If you need account-level company intelligence, buy something built for company data. The expensive mistake ]]></description>
        <link>https://nubela.co/blog/competitor-research-tools/</link>
        <guid isPermaLink="false">69df4e74997d030001e881c9</guid>
        <category><![CDATA[ competitor research tools ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Wed, 15 Apr 2026 16:38:13 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_8.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Most <strong>competitor research tools</strong> lists are useless because they mash five different jobs into one fake category. If you only need keyword overlap, buy an SEO tool. If you need ongoing monitoring, buy a monitor. If you need account-level company intelligence, buy something built for company data. The expensive mistake is buying a bloated suite because the demo looked smart.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/WebsiteSEO</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/khrissteven</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Yes! if you actually use it... If you only dip in occasionally, it’s too expensive.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/WebsiteSEO/comments/1q34axh/is_ahrefs_still_worth_the_price_if_youre_not_an/nxhx6mx/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>When I was running FluxoMetric, I learned the hard way that "all-in-one" usually means "half-useful across six tabs." I burned ~${"4K"}/mo on tools that made me feel informed while I was still blind to the part that mattered: what changed, who moved, and whether the move affected my market.</p>
<h2 id="tldr">TL;DR</h2>
<p>Here is the fast answer on <strong>competitor research tools</strong>.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Ahrefs</th>
<th>Semrush</th>
<th>Similarweb</th>
<th>SpyFu</th>
<th>Visualping</th>
<th><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Keyword overlap</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>Ahrefs</td>
</tr>
<tr>
<td>PPC intel</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>SpyFu</td>
</tr>
<tr>
<td>Traffic intel</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>Similarweb</td>
</tr>
<tr>
<td>Monitoring</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Visualping / NinjaPear</td>
</tr>
<tr>
<td>Company intelligence</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Pricing sanity</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>SpyFu</td>
</tr>
<tr>
<td>API / exports</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Executive usefulness</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td><strong>Overall score</strong></td>
<td><strong>3.13/5</strong></td>
<td><strong>3.06/5</strong></td>
<td><strong>2.94/5</strong></td>
<td><strong>2.94/5</strong></td>
<td><strong>2.63/5</strong></td>
<td><strong>3.50/5</strong></td>
<td><strong>Depends on job</strong></td>
</tr>
</tbody>
</table>
<p>That last row is the whole point. There is no single best competitor research tool because this is not one category. It is five jobs wearing one trench coat.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: CEO Competitor Research Scorecard + Weekly Battlecard Template</strong><br>
<span style="color:#555;">A practical spreadsheet with tool scoring, stack budget planning, a weekly battlecard template, and a monitoring tracker.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/competitor-research-scorecard-13fc1744.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="what-most-lists-get-wrong">What most lists get wrong</h2>
<p>Most lists call everything from Ahrefs to Crayon to Similarweb a competitor research tool. That is lazy. It is also how buyers end up paying for the wrong thing.</p>
<p>These are the actual buckets:</p>
<ol>
<li><strong>Keyword overlap</strong>: who ranks where, who owns what terms, where your content gaps are.</li>
<li><strong>PPC intel</strong>: who bids on what, what ads they keep running, where paid competition is heating up.</li>
<li><strong>Traffic intel</strong>: directional traffic, channel mix, geography, audience share.</li>
<li><strong>Ongoing monitoring</strong>: pricing changes, new pages, launch posts, messaging shifts.</li>
<li><strong>Company intelligence</strong>: customers, partners, investors, hiring moves, competitive maps.</li>
</ol>
<p>A CEO shopping for <strong>competitor research tools</strong> usually does not need one platform. They need one answer per job.</p>
<p>This is where a lot of software buying goes wrong. Somebody buys a giant suite, then the team uses 12% of it, then six months later everyone says they need "better adoption." No. They needed a tighter brief.</p>
<h2 id="the-short-answer">The short answer</h2>
<p>Here is the shortest honest buying guide I can give you.</p>
<h3 id="best-for-keyword-overlap">Best for keyword overlap</h3>
<p><strong>Ahrefs</strong> is my pick if you care about depth, backlink context, and content gap work.</p>
<p><strong>Semrush</strong> is the better fit if you want a broader suite and are willing to tolerate more sprawl.</p>
<p>Ahrefs public pricing is unusually clear. At the time of writing, it lists <strong>Starter at $29/mo</strong>, <strong>Lite at $129/mo</strong>, <strong>Standard at $249/mo</strong>, and <strong>Advanced at $449/mo</strong>. That makes it one of the easier tools to budget.</p>
<p>Semrush also publishes pricing, though the product packaging has gotten more layered over time. Its SEO plans show <strong>Pro at $139/mo</strong>, with lower annualized rates when billed yearly, then <strong>Guru</strong> and <strong>Business</strong> above that.</p>
<h3 id="best-for-ppc-intel">Best for PPC intel</h3>
<p><strong>SpyFu</strong>.</p>
<p>Not because it is magical. Because the job is narrow and the price is sane. SpyFu's pricing page starts at <strong>$39/mo</strong> on Basic, with <strong>Pro + AI</strong> higher and <strong>Team</strong> above that. If your real job is ad history and keyword reconnaissance, that is enough.</p>
<h3 id="best-for-traffic-intel">Best for traffic intel</h3>
<p><strong>Similarweb</strong>, but only if you actually need traffic intel.</p>
<p>Most CEOs do not. They need cleaner decisions, not prettier traffic charts. Similarweb has public packages, but the useful stuff quickly moves you into bigger plans. Public entry points vary by package, with some self-serve offers and a lot of sales-led pricing.</p>
<h3 id="best-for-monitoring">Best for monitoring</h3>
<p><strong>Visualping</strong> for page-level monitoring.</p>
<p>Visualping is good at one thing: watch a page and tell me it changed. Public pricing starts at <strong>$10/mo</strong> for personal use, with bigger business tiers above that.</p>
<h3 id="best-for-company-intelligence">Best for company intelligence</h3>
<p><strong><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></strong>, if your question is not "who outranks us?" but "who buys from them, what changed at the company, and where are the useful account signals?"</p>
<p>That is a different job from SEO. It should be a different tool.</p>
<h2 id="types-of-competitor-research">Types of competitor research</h2>
<p>If you skip this section, you are more likely to buy the wrong product.</p>
<h3 id="keyword-overlap">Keyword overlap</h3>
<p>This is classic search work:</p>
<ul>
<li>who ranks for the same terms</li>
<li>where you are losing share</li>
<li>what content gaps matter</li>
<li>what backlinks or SERP features they own</li>
</ul>
<p>Ahrefs and Semrush are built for this. Everything else is filling in.</p>
<h3 id="ppc-overlap">PPC overlap</h3>
<p>Different job.</p>
<p>You want to know:</p>
<ul>
<li>which keywords competitors appear on</li>
<li>which ad copy they keep reusing</li>
<li>what landing pages keep showing up</li>
<li>where paid competition is getting hotter</li>
</ul>
<p>SpyFu is the budget specialist here. Google Ads Auction Insights is still better for your own account truth, but not for broader market snooping.</p>
<h3 id="traffic-intel">Traffic intel</h3>
<p>Traffic intel is estimation. That does not make it useless. It does mean you should stop treating it like audited financials.</p>
<p>Use it for:</p>
<ul>
<li>relative comparisons</li>
<li>directional trends</li>
<li>share-of-market discussions</li>
<li>channel mix sanity checks</li>
</ul>
<p>Do not use it to argue over whether a site got exactly 1.7M or 2.1M visits.</p>
<h3 id="ongoing-monitoring">Ongoing monitoring</h3>
<p>This is the "what changed since last week?" layer.</p>
<p>You care about:</p>
<ul>
<li>pricing page edits</li>
<li>new feature pages</li>
<li>fresh blog posts</li>
<li>social posts</li>
<li>message changes</li>
<li>launches and removals</li>
</ul>
<p>Visualping handles the page-watch piece well. Broader monitoring needs broader collection and better filtering.</p>
<h3 id="company-intelligence">Company intelligence</h3>
<p>This is the layer most <strong>competitor research tools</strong> roundups barely understand.</p>
<p>You care about:</p>
<ul>
<li>customers</li>
<li>partners and platforms</li>
<li>investors</li>
<li>hiring shifts</li>
<li>leadership changes</li>
<li>account-level timing signals</li>
</ul>
<p>SEO tools are weak here. They tell you who ranks next to you. They do not tell you who buys from your competitor or when a prospect account just changed its stack.</p>
<h2 id="the-scorecard">The scorecard</h2>
<p>I care about a few things when I test these tools:</p>
<ul>
<li>Does the data help me make a decision this week?</li>
<li>How many clicks until the useful part?</li>
<li>Is the price sane for a small team?</li>
<li>Does the monitoring create signal or noise?</li>
<li>Can I export or pipe data into something else?</li>
<li>Is this useful to a CEO, not just a specialist?</li>
</ul>
<h3 id="scoring-criteria">Scoring criteria</h3>
<table>
<thead>
<tr>
<th>Criteria</th>
<th>What I mean</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data usefulness</td>
<td>Good enough to change a decision</td>
</tr>
<tr>
<td>Speed to insight</td>
<td>I can get the answer in minutes</td>
</tr>
<tr>
<td>Pricing sanity</td>
<td>Price fits the job</td>
</tr>
<tr>
<td>Monitoring depth</td>
<td>Catches changes that matter</td>
</tr>
<tr>
<td>API / export access</td>
<td>Data can move into a workflow</td>
</tr>
<tr>
<td>Executive usefulness</td>
<td>A CEO can use it without becoming an analyst</td>
</tr>
</tbody>
</table>
<h3 id="tools-compared">Tools compared</h3>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Keyword overlap</th>
<th>PPC intel</th>
<th>Traffic intel</th>
<th>Monitoring</th>
<th>Company intelligence</th>
<th>Pricing transparency</th>
<th>API / export</th>
<th>Ease of use</th>
<th>Overall CEO score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Semrush</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td>Ahrefs</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.5/5</strong></td>
</tr>
<tr>
<td>Similarweb</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td>SpyFu</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.5/5</strong></td>
</tr>
<tr>
<td>Visualping</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>2.8/5</strong></td>
</tr>
<tr>
<td>Owler</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>2.6/5</strong></td>
</tr>
<tr>
<td>SparkToro</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>2.8/5</strong></td>
</tr>
<tr>
<td>Wappalyzer</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>2.4/5</strong></td>
</tr>
<tr>
<td>Crayon</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.0/5</strong></td>
</tr>
<tr>
<td>Klue</td>
<td>⭐☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.0/5</strong></td>
</tr>
<tr>
<td>NinjaPear</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.0/5</strong></td>
</tr>
</tbody>
</table>
<p>The enterprise CI tools have a recurring problem. If nobody maintains the system, the system becomes furniture.</p>
<h2 id="keyword-overlap-tools">Keyword overlap tools</h2>
<p>If the job is search overlap, do not talk yourself into buying a generic CI suite.</p>
<h3 id="ahrefs">Ahrefs</h3>
<p>Ahrefs is still the cleanest tool here if the work is:</p>
<ul>
<li>backlink inspection</li>
<li>content gap work</li>
<li>SERP analysis</li>
<li>SEO operator workflows</li>
</ul>
<p>I like that Ahrefs pricing is public and readable. I also like that the product is still opinionated. It feels built by people who expect you to do actual SEO, not admire a dashboard.</p>
<p>What I like:</p>
<ul>
<li>strong backlink context</li>
<li>clean workflow for content gap work</li>
<li>good depth for people who live in SEO every week</li>
</ul>
<p>What I do not like:</p>
<ul>
<li>expensive if you use it casually</li>
<li>easier to justify for operators than founders</li>
<li>not the tool I would buy for broad company intelligence</li>
</ul>
<p>If you log in twice a month, it is probably too much tool.</p>
<h3 id="semrush">Semrush</h3>
<p>Semrush is broader.</p>
<p>That can be good. It can also mean you are paying for surface area you will never touch.</p>
<p>What I like:</p>
<ul>
<li>broader workflow coverage</li>
<li>decent overlap and competitive research features</li>
<li>good fit if one team wants one account for several adjacent jobs</li>
</ul>
<p>What I do not like:</p>
<ul>
<li>sprawl</li>
<li>too many tabs for buyers with a narrow brief</li>
<li>easy to overbuy if you only need one core motion</li>
</ul>
<p>Semrush makes sense when one team is going to live in it. It makes less sense when a founder wants one sharp answer once a week.</p>
<h3 id="spyfu">SpyFu</h3>
<p>SpyFu is better than its prestige suggests.</p>
<p>That is not the same as saying it is better than everything else. It means it knows what lane it is in.</p>
<p>For <strong>$39/mo</strong>, you get a cheap way to inspect competitor ad history, keyword overlap, and basic domain comparisons. For a lot of PPC teams, that is enough.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/PPC</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/sumogringo</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">SpyFu for the cost is far less expensive but I wouldn't use either tool really to build out ppc campaigns... The only somewhat valuable part is having a library of some of a competitors ad copy they’ve tried.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/PPC/comments/wmvyd4/spyfu_vs_semrush_for_ppc/ik32xpw/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is about right. Use SpyFu as cheap reconnaissance. Do not use it as forensic truth.</p>
<h2 id="traffic-intel-tools">Traffic intel tools</h2>
<p>This is the part of the market where the charts get nicer as the certainty gets worse.</p>
<h3 id="similarweb">Similarweb</h3>
<p>Similarweb is the best-known traffic intel product because it is easy to explain to an executive team.</p>
<p>What it does well:</p>
<ul>
<li>directional traffic comparisons</li>
<li>channel views</li>
<li>geography splits</li>
<li>market-level benchmarking</li>
</ul>
<p>What it does poorly:</p>
<ul>
<li>stopping buyers from treating estimates as truth</li>
<li>stopping teams from overbuying</li>
</ul>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/PPC</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/ggildner</span>
<span style="color:#878a8c;">· ▲ 25</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">...the estimates from either tool are misleading at best and wildly inaccurate at worst. We've compared the results within SpyFu or SEMRush with actual results from campaigns we've run for years...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/PPC/comments/wmvyd4/spyfu_vs_semrush_for_ppc/ik1soz5/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is about PPC tools, but the discipline carries over. Estimated market data is still estimated market data.</p>
<p>I use Similarweb as directional evidence. I do not use it as scripture.</p>
<p>Most CEOs do not need Similarweb. They need a better answer to "is this market moving?" and "where are we being outflanked?" If you cannot name the decision the tool changes, skip it.</p>
<h3 id="semrush-traffic-tools">Semrush traffic tools</h3>
<p>If you already pay for Semrush, its traffic and competitive research features are often enough.</p>
<p>Not as deep as Similarweb. Usually enough for:</p>
<ul>
<li>rough benchmarking</li>
<li>channel mix glimpses</li>
<li>quick market checks</li>
</ul>
<p>If you are running a smaller company and somebody is pushing Similarweb by default, I would ask what decision requires it. Usually the answer gets vague fast.</p>
<h3 id="sparktoro">SparkToro</h3>
<p>SparkToro is not a traffic estimation platform. It is an audience discovery tool.</p>
<p>That distinction matters.</p>
<p>Sometimes the real question is not "how much traffic do they get?" It is "where does this audience pay attention?"</p>
<p>SparkToro pricing starts at <strong>$38/mo</strong> with a free tier above that. Good fit for:</p>
<ul>
<li>source discovery</li>
<li>audience research</li>
<li>creator / publication / podcast mapping</li>
</ul>
<p>Wrong fit if you want a Similarweb clone.</p>
<h2 id="monitoring-tools">Monitoring tools</h2>
<p>Monitoring is where a lot of teams either save themselves or sign up for fresh inbox noise.</p>
<h3 id="visualping">Visualping</h3>
<p>Visualping is a clean answer for page-level monitoring.</p>
<p>You point it at:</p>
<ul>
<li>pricing pages</li>
<li>feature pages</li>
<li>comparison pages</li>
<li>docs pages</li>
<li>policy pages</li>
</ul>
<p>and it tells you what changed.</p>
<p>That is useful. It is also very easy to configure badly.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/programming</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/maxupp</span>
<span style="color:#878a8c;">· ▲ 8</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">...visualping makes screenshots and compares those, and sometimes just moves a pixel, thereby marking a huge number of changed pixel where in reality the content is exactly the same.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/programming/comments/ha054s/got_really_annoyed_with_visualpingio_last_night/fv00sse/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the failure mode. Pixel diffs without context become noise.</p>
<p>My rule is simple: monitor fewer pages, but monitor pages that can change a deal.</p>
<h3 id="owler">Owler</h3>
<p>Owler is fine for lightweight company alerts.</p>
<p>That sounds faint praise because it is. But faint praise is appropriate here.</p>
<p>If you want:</p>
<ul>
<li>basic company following</li>
<li>simple alerts</li>
<li>easier setup than enterprise CI software</li>
</ul>
<p>it can work. It is not deep company intelligence. It is not relationship mapping. It is not what I would buy for a team that needs account-level precision.</p>
<h3 id="crayon-klue">Crayon / Klue</h3>
<p>I am grouping these together because they solve a similar org problem:</p>
<ul>
<li>product marketing</li>
<li>sales enablement</li>
<li>battlecards</li>
<li>CI distribution inside a team</li>
</ul>
<p>This is the part where a lot of software buying becomes theater.</p>
<p>If nobody updates the battlecards, you did not buy intelligence software. You bought an expensive graveyard.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/digital_marketing</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Ok_Reaction_9854</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Most of these tools are like: “Page changed!” Cool... what changed? why do I care? am I supposed to panic or ignore this?... Alerts without context are just noise.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/digital_marketing/comments/1qi7q9m/deleted_by_user/o0vpt6s/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the problem statement in one paragraph.</p>
<h3 id="ninjapear">NinjaPear</h3>
<p>This is where I need to be precise.</p>
<p>NinjaPear is not trying to replace Ahrefs. It is not pretending to be a generic SEO suite.</p>
<p>It is useful when the monitoring job spans:</p>
<ul>
<li>blog posts</li>
<li>X posts</li>
<li>meaningful website changes</li>
<li>customer and competitor context</li>
</ul>
<p>That last part matters. A page diff without business context is just motion. Context is what makes the motion useful.</p>
<p>The first mention that fits this section is <a href="https://nubela.co/company-monitor?ref=nubela.co">NinjaPear Company Monitor</a>. It watches blogs, websites, and social posts, then tries to filter down to changes that matter.</p>
<h2 id="company-intelligence-tools">Company intelligence tools</h2>
<p>This is where most lists flatten the category and lose the plot.</p>
<h3 id="ninjapear_1">NinjaPear</h3>
<p>If I care about business questions, I want business data.</p>
<p>The useful pieces on <a href="https://nubela.co/companies?ref=nubela.co">NinjaPear</a> are:</p>
<ul>
<li>company updates</li>
<li>customer lists</li>
<li>competitor identification</li>
<li>employee profiles</li>
<li>usage-based API access</li>
</ul>
<p>The pricing page is sparse, but the public credit table is refreshingly concrete. It lists <strong>2 credits</strong> for Company Details, <strong>2 credits</strong> for Employee Count, and <strong>1 credit + 2 credits per customer returned</strong> for Customer Listing. That is a lot more useful than "contact sales."</p>
<p>This is the point where SEO-only competitor research starts looking incomplete.</p>
<p>If you know who buys from a competitor, you can:</p>
<ul>
<li>build a target account list</li>
<li>compare ecosystems</li>
<li>find whitespace</li>
<li>understand where the market already trusts similar vendors</li>
</ul>
<p>That is closer to how CEOs and sales leaders actually make decisions.</p>
<h3 id="owler">Owler</h3>
<p>Owler gives you lightweight awareness.</p>
<p>That is not nothing. It is just not the same as relationship intelligence, customer mapping, or fresh account signals.</p>
<h3 id="similarweb-and-others">Similarweb and others</h3>
<p>Similarweb can tell you a lot about audience and traffic patterns. It cannot tell you the relationship map behind the market.</p>
<p>That distinction matters.</p>
<p>Traffic intel answers: <strong>How visible are they?</strong></p>
<p>Company intelligence answers: <strong>How are they embedded in the market?</strong></p>
<p>Different questions. Different tools.</p>
<h2 id="free-tools-that-still-help">Free tools that still help</h2>
<p>Not every stack needs to start with a $400 tab.</p>
<h3 id="free-seo-checks">Free SEO checks</h3>
<p>Still useful:</p>
<ul>
<li><strong>Wappalyzer</strong> extension for quick tech stack checks</li>
<li>Google search operators for rough overlap checks</li>
<li>free traffic checkers for direction, not truth</li>
<li>limited free SEO tool tiers</li>
</ul>
<p>Wappalyzer has a free tier, then jumps to paid plans fast. Its pricing page lists <strong>Pro at $250/mo</strong> and <strong>Business at $450/mo</strong>. That makes the extension much more useful than the broader paid product for most small teams.</p>
<h3 id="free-monitoring">Free monitoring</h3>
<p>Visualping's free checks can cover a handful of critical pages if you are disciplined.</p>
<p>Track:</p>
<ul>
<li>one pricing page</li>
<li>one product page</li>
<li>one compare page</li>
<li>one blog or changelog feed</li>
</ul>
<p>Not 200 pages because it felt productive during setup.</p>
<h3 id="free-company-research">Free company research</h3>
<p>Public company pages, news searches, press releases, funding pages, and free developer utilities still do useful work.</p>
<p>If you can answer the question with public web plus a browser extension, do that first.</p>
<h2 id="tool-stacks-by-team">Tool stacks by team</h2>
<p>This is where I see the most wasted money.</p>
<h3 id="ceo-at-a-small-company">CEO at a small company</h3>
<p>Buy:</p>
<ul>
<li>one SEO tool, <strong>Ahrefs or Semrush</strong></li>
<li>one monitoring tool, <strong>Visualping</strong></li>
</ul>
<p>Do not buy:</p>
<ul>
<li>Ahrefs + Semrush + Similarweb + an enterprise CI platform</li>
</ul>
<p>You do not need three overlapping suites to feel serious.</p>
<h3 id="growth-marketing-team">Growth marketing team</h3>
<p>Buy:</p>
<ul>
<li>Semrush or Ahrefs</li>
<li>maybe SpyFu if PPC matters</li>
<li>add monitoring only if somebody actually owns it</li>
</ul>
<p>If nobody owns it, the alerts become wallpaper.</p>
<h3 id="product-marketing-ci-team">Product marketing / CI team</h3>
<p>Buy:</p>
<ul>
<li>monitoring</li>
<li>battlecard workflow only if the team is real, not aspirational</li>
<li>company intelligence if you need context across accounts and competitors</li>
</ul>
<p>This is where broader CI tooling starts to make sense. It is also where shelfware starts.</p>
<h3 id="b2b-sales-team">B2B sales team</h3>
<p>SEO tools alone are half-blind here.</p>
<p>You need:</p>
<ul>
<li>company changes</li>
<li>relationship mapping</li>
<li>customer lists</li>
<li>account-level signals</li>
</ul>
<p>This is why SEO tooling alone disappoints sales leaders. It answers the wrong question.</p>
<h2 id="where-ninjapear-fits">Where NinjaPear fits</h2>
<p>I do not like vendor writing that pretends one tool replaces everything. So here is the narrower, honest version.</p>
<h3 id="what-it-is-good-at">What it is good at</h3>
<p>NinjaPear is good at:</p>
<ul>
<li>company updates</li>
<li>competitor mapping</li>
<li>customer lists</li>
<li>relationship intelligence</li>
<li>B2B account research</li>
<li>API-first workflows</li>
</ul>
<p>That is the lane.</p>
<h3 id="what-it-is-not">What it is not</h3>
<p>It is <strong>not</strong> a replacement for Ahrefs or Semrush when the job is:</p>
<ul>
<li>backlink analysis</li>
<li>keyword clustering</li>
<li>content gap work</li>
<li>SERP-level SEO analysis</li>
</ul>
<p>That is not modesty. It is just category hygiene.</p>
<h2 id="faq">FAQ</h2>
<h3 id="what-is-the-best-competitor-research-tool-overall">What is the best competitor research tool overall?</h3>
<p>There is no single best tool overall. For keyword overlap, buy <strong>Ahrefs or Semrush</strong>. For PPC, buy <strong>SpyFu</strong>. For traffic intel, buy <strong>Similarweb</strong> if you truly need it. For business relationship intelligence, buy <strong>NinjaPear</strong>.</p>
<h3 id="what-are-the-best-free-competitor-research-tools">What are the best free competitor research tools?</h3>
<p>Wappalyzer's free extension, Visualping's free checks, search operators, and free traffic checker tools are the best starting point. They will not replace paid tools, but they can stop you from buying blindly.</p>
<h3 id="what-is-the-best-tool-for-keyword-overlap">What is the best tool for keyword overlap?</h3>
<p><strong>Ahrefs</strong> gets my vote for depth. <strong>Semrush</strong> if you want broader workflow coverage.</p>
<h3 id="what-is-the-best-tool-for-ongoing-competitor-monitoring">What is the best tool for ongoing competitor monitoring?</h3>
<p><strong>Visualping</strong> for page-level change detection. If you want broader company-level monitoring across sites, blogs, and X, NinjaPear is stronger.</p>
<h3 id="is-similarweb-accurate-enough-to-trust">Is Similarweb accurate enough to trust?</h3>
<p>Directionally, yes. Literally, no. Use it for trend direction and peer comparison. Not audited truth.</p>
<h3 id="spyfu-vs-semrush-which-is-better-for-ppc">SpyFu vs Semrush, which is better for PPC?</h3>
<p>For narrow PPC competitor intel, <strong>SpyFu</strong> is better value. For a broader marketing suite that also includes PPC-adjacent workflows, <strong>Semrush</strong> is broader but more expensive.</p>
<h3 id="what-is-the-best-competitor-research-tool-for-ceos">What is the best competitor research tool for CEOs?</h3>
<p>For most CEOs, the best stack is <strong>one SEO tool plus one monitoring tool</strong>. Add company intelligence only if your market motion and deal timing actually require it.</p>
<h2 id="final-verdict">Final verdict</h2>
<p>Here is the blunt answer.</p>
<ul>
<li>For keyword overlap, buy <strong>Ahrefs or Semrush</strong>.</li>
<li>For PPC intel, buy <strong>SpyFu</strong>.</li>
<li>For traffic intel, buy <strong>Similarweb</strong> only if you actually need it.</li>
<li>For ongoing monitoring, buy <strong>Visualping</strong> or a broader monitor if your team will use it.</li>
<li>For business relationship intelligence, add <strong>NinjaPear</strong>.</li>
<li>Do not buy a giant suite to solve a narrow problem.</li>
</ul>
<p>That last line is the article.</p>
<p>"Competitor research tools" is mostly a fake category. Real buying decisions happen one job at a time.</p>
<p>If you want a practical next step, download the scorecard and fill it out before you buy anything. That exercise alone will usually kill one bad purchase.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: CEO Competitor Research Scorecard + Weekly Battlecard Template</strong><br>
<span style="color:#555;">Use it to score tools by job type, plan your monthly spend, and run a weekly competitor review without turning it into theater.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/competitor-research-scorecard-13fc1744.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If your real blind spot is company changes, customer overlap, and relationship mapping, then that is the point where an SEO tool stops being enough. That is where I would look at NinjaPear. If not, keep your stack smaller. Smaller stacks get used.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Build NinjaPear integrations with Claude/Codex/OpenCode (Skill+AI Docs) ]]></title>
        <description><![CDATA[ Most of the support requests I receive via email are API integration problems that arise due to users&#39; use of (mostly) Claude. This is why I&#39;m happy to share that I have added NinjaPear API documentation for LLM agents and a NinjaPear skill for AI agents.


If ]]></description>
        <link>https://nubela.co/blog/ninjapear-skill/</link>
        <guid isPermaLink="false">69def86e997d030001e881ba</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 15 Apr 2026 10:36:12 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/aiskill.png" medium="image"/>
        <content:encoded><![CDATA[ <p>Most of the support requests I receive via email are API integration problems that arise due to users' use of (mostly) Claude. This is why I'm happy to share that I have added <a href="https://nubela.co/llms-full.txt?ref=nubela.co">NinjaPear API documentation for LLM agents</a> and a <a href="https://nubela.co/docs/?ref=nubela.co#ai-skill">NinjaPear skill for AI agents</a>.</p>
<p>If you are using Claude Code (and not hating on Anthropic because of the recent nerf to their model), add the NinjaPear skill to Claude:</p>
<p>Bash</p>
<pre><code>$ npx skills add NinjaPear/ninjapear-skill -a claude-code
</code></pre>
<p>And if you've started exploring Codex like I have:</p>
<p>Bash</p>
<pre><code>npx skills add NinjaPear/ninjapear-skill -a codex
</code></pre>
<p>It's pretty cool. Once you have that added, the skill will give your coding agent knowledge on how to best work with NinjaPear correctly, including SDK integration, error/pagination/rate limit/timeout handling, as well as cost management!</p>
<p>In case you do not know yet, I'm an AI maximalist. And <strong>a lot</strong> of NinjaPear is driven by AI—much more than you think. When NinjaPear hits $1M ARR, and I'm sure it will in a few months' time, I'll show you what goes on behind the scenes of NinjaPear.</p>
<hr>
<p>Ok, in a nutshell:</p>
<ol>
<li><strong>For integrators</strong>: Use the <a href="https://github.com/NinjaPear/ninjapear-skill?ref=nubela.co">NinjaPear skill</a> if you are integrating NinjaPear into your applications.</li>
<li><strong>For users</strong>: Use the <a href="https://nubela.co/docs/?ref=nubela.co#claude-ai">NinjaPear MCP</a> if you want to work with NinjaPear's data inside your AI agent without writing code.</li>
<li><strong>For non-AI maximalists</strong>: Use <a href="https://nubela.co/llms-full.txt?ref=nubela.co">NinjaPear docs for AI agents</a>, which you can link to or drag and drop into your AI agent chat.</li>
</ol>
<p>Questions? Shoot me an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Visualping Review 2026 for CEOs, by an ex-CEO + Reddit/X comments ]]></title>
        <description><![CDATA[ I’ve signed the software bill before. That changes how you look at tools like Visualping. Here’s the short version: Visualping is good at watching pages. I’d use it for pricing pages, job boards, docs, policy pages, and some gated portals. I would not use it as my ]]></description>
        <link>https://nubela.co/blog/visualping-review/</link>
        <guid isPermaLink="false">69dae39f997d030001e881a8</guid>
        <category><![CDATA[ visualping ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Sun, 12 Apr 2026 08:13:22 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_7.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>I’ve signed the software bill before. That changes how you look at tools like <strong>Visualping</strong>. Here’s the short version: Visualping is good at watching pages. I’d use it for pricing pages, job boards, docs, policy pages, and some gated portals. I would not use it as my main competitive intelligence system. That is the mistake. Not the tool.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/programming</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/maxupp</span>
<span style="color:#878a8c;">· ▲ n/a</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Using visualping, I can tell it wait 5 seconds for all the JS to load, then click on a bunch of elements, write my zip code and then check if it’s available.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/programming/comments/ha054s/got_really_annoyed_with_visualpingio_last_night/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is useful because it kills the lazy take. Visualping is not a toy. It can do real browser steps. The problem is that people buy a page monitor and expect it to think for them.</p>
<h2 id="tldr">TL;DR</h2>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Visualping</th>
<th>Distill.io</th>
<th>changedetection.io</th>
<th>NinjaPear Company Monitor</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data freshness</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Distill.io</td>
</tr>
<tr>
<td>Data richness</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>changedetection.io</td>
</tr>
<tr>
<td>Developer friendliness</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>changedetection.io</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Tie</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.10/5</strong></td>
<td><strong>3.67/5</strong></td>
<td><strong>4.00/5</strong></td>
<td><strong>4.00/5</strong></td>
<td>changedetection.io / NinjaPear</td>
</tr>
</tbody>
</table>
<p>If you only need page alerts, Visualping is a sane buy. If you need company intel, it is the wrong layer.</p>
<h2 id="upfront-im-a-competitor">Upfront: I’m a competitor</h2>
<p>I lead GTM at NinjaPear. We sell <a href="https://nubela.co/company-monitor?ref=nubela.co">Company Monitor</a>. So yes, I’m biased.</p>
<p>I still think that bias is useful here.</p>
<p>I’ve spent real money on this category. When I was running FluxoMetric, I wasted ~$4K a month at one point on monitoring and enrichment tools that looked good in demos and created work in practice. More alerts. More tabs. More triage. Less signal.</p>
<p>So I’m not selling you neutrality. I’m giving you the version I’d want if I were the one approving the spend.</p>
<h2 id="the-20-second-verdict">The 20-second verdict</h2>
<p><strong>Verdict:</strong> Visualping is good software. It is easy to set up, good on visual diffs, and more capable on dynamic pages than most people realize. My score is <strong>3.1/5</strong>.</p>
<h3 id="use-it-for-page-alerts">Use it for page alerts</h3>
<p>Use Visualping for:
- pricing pages
- careers pages
- docs and changelogs
- policy and compliance pages
- restocks and ticket drops
- some authenticated dashboards</p>
<p>That is a real list. Not a consolation prize.</p>
<h3 id="skip-it-for-market-intel">Skip it for market intel</h3>
<p>Do not buy Visualping if what you actually mean is: “tell me what this company is doing.”</p>
<p>A page monitor can tell you a page changed. It does not automatically tell you whether the change matters, what it means, or how it connects to the rest of the company’s behavior.</p>
<p>That sounds like a small distinction. It isn’t.</p>
<h2 id="what-visualping-gets-right">What Visualping gets right</h2>
<h3 id="setup-is-dead-simple">Setup is dead simple</h3>
<p>This part is good.</p>
<p>The homepage still does the right thing. It shows the basic workflow fast: enter URL, click Go, choose what to track, pick frequency, send the alert. That matters because half the battle here is getting somebody to actually finish setup.</p>
<p><img alt="Visualping homepage hero" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/3e3cc0d016da.webp" /></p>
<p>That is a better product story than the usual feature soup.</p>
<h3 id="visual-diffs-are-human-friendly">Visual diffs are human-friendly</h3>
<p>A lot of monitoring tools are built for people who don’t mind selectors, HTML, and ugly text diffs.</p>
<p>Visualping is easier on normal humans.</p>
<p>That matters if the reviewer is a founder, PMM, RevOps lead, or analyst who wants to know what moved without reading DOM noise. Screenshot diffs are easier to scan than raw page churn. You see the change. Fast.</p>
<h3 id="it-handles-tricky-pages">It handles tricky pages</h3>
<p>Visualping can do more than static pages.</p>
<p>TechRadar specifically called out its “perform actions” feature for typing, clicking, and scrolling. Visualping’s own 2026 guide on password-protected pages also documents two approaches for gated content:</p>
<ol>
<li>Chrome extension</li>
<li>Pre-actions with element selector</li>
</ol>
<p>That means it can handle things like login flows, wait states, and pages that need a little browser behavior before the content appears.</p>
<p>That does not make it magic. It just makes it more capable than the average review admits.</p>
<h2 id="where-it-starts-to-suck">Where it starts to suck</h2>
<h3 id="change-is-not-signal">Change is not signal</h3>
<p>This is the core problem.</p>
<p>A page monitor tells you something changed. It does not reliably tell you:
- whether the change matters commercially
- whether it was noise
- whether the change connects to anything bigger
- whether someone should act on it</p>
<p>Visualping clearly knows this. Their product and help docs lean hard into AI summaries, AI importance logic, and higher-end managed options.</p>
<p>Their own help article on Business vs Solutions says the Solutions tier includes <strong>AI concierge service</strong>, <strong>custom data structure and output</strong>, <strong>starter packs</strong>, <strong>image change interpretation</strong>, and upgraded models for better summaries.</p>
<p>That tells you what the real hard part is.</p>
<p>Not crawling pages. Interpreting them.</p>
<h3 id="noise-becomes-labor">Noise becomes labor</h3>
<p>The invoice is rarely the real cost.</p>
<p>The real cost is the person who has to read the alerts.</p>
<p>Who opens them? Who filters junk? Who decides what matters? Who keeps false positives from becoming background radiation?</p>
<p>That cost compounds fast.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SaaS</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/rignaneseleo</span>
<span style="color:#878a8c;">· ▲ n/a</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">False Positives: Visual monitors alert you when pixels change (e.g., an ad banner updates or a cookie popup appears). I only care if the actual date changes.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SaaS/comments/1qg9mko/i_tried_using_visualping_to_track_event_dates_but/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the category in one paragraph.</p>
<p>The product can be fine. The labor model can still be wrong.</p>
<h3 id="website-only-is-a-narrow-lens">Website-only is a narrow lens</h3>
<p>If your use case is “watch this page,” website-only is fine.</p>
<p>If your use case is “watch this company,” website-only is already incomplete.</p>
<p>Companies signal through:
- website edits
- new pages in sitemaps
- blog posts
- changelogs
- X posts
- hiring activity
- positioning changes</p>
<p>Visualping covers one slice of that well. It does not cover the whole thing as one feed.</p>
<p>That is why I keep separating <strong>page monitoring</strong> from <strong>company monitoring</strong>. They are different jobs.</p>
<h2 id="pricing-the-real-trap">Pricing: the real trap</h2>
<h3 id="free-gets-you-hooked">Free gets you hooked</h3>
<p>Public references on Visualping’s free plan vary.</p>
<p>The Chrome Web Store listing says <strong>62 checks/month free</strong> for the server service. TechRadar’s 2025 review says <strong>150 checks/month</strong> and <strong>5 pages</strong> on the free plan.</p>
<p>That inconsistency is not the point.</p>
<p>The point is that the free tier is for learning the product, not for pricing a workflow.</p>
<h3 id="business-is-where-workflows-start">Business is where workflows start</h3>
<p>TechRadar reported these public anchors in 2025:
- <strong>$10/month</strong> for <strong>1,000 checks</strong> and up to <strong>25 pages</strong>
- <strong>$50/month</strong> for <strong>10,000 checks</strong> and up to <strong>200 pages</strong>
- <strong>$100/month</strong> for <strong>20,000 checks</strong> and around <strong>500 pages</strong>
- <strong>$250/month</strong> for <strong>50,000 checks</strong> and around <strong>1,500 pages</strong></p>
<p>Those are useful reference points. They are not the main story.</p>
<p>The main story is this: once you need Slack, Teams, Sheets, API, webhooks, shared workflows, and real team use, you are no longer buying a cheap side tool.</p>
<p>You are buying workflow software.</p>
<p>Visualping’s own help doc says Business plans are for professionals who want to integrate changes through <strong>API, Webhook, Google Sheets, Slack, or MS Teams</strong>. Their integrations page says integrations are available in all Business plans.</p>
<p>That is reasonable. I’m not complaining about it.</p>
<p>I’m saying buyers often budget for a utility and end up deploying a system.</p>
<h3 id="human-review-is-the-hidden-cost">Human review is the hidden cost</h3>
<p>TechRadar also mentions paid support add-ons at <strong>$600/year</strong>, <strong>$1,200/year</strong>, and <strong>$3,000/year</strong>.</p>
<p>That is not even the part I care about most.</p>
<p>The hidden line item is analyst time.</p>
<p>If Visualping saves your team six hours a month, it is cheap.</p>
<p>If it creates eight hours a month of low-grade review work, it is not cheap anymore.</p>
<h2 id="api-and-integrations-reality">API and integrations reality</h2>
<h3 id="integrations-are-solid">Integrations are solid</h3>
<p>Visualping’s integrations page lists:
- Slack
- Microsoft Teams
- Google Chat
- Zapier
- Google Sheets
- Lindy.ai
- n8n
- Webhooks
- Discord
- API</p>
<p><img alt="Visualping integrations page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/2bb672f22751.webp" /></p>
<p>That is a respectable list.</p>
<p>If your workflow ends in Slack or a webhook, Visualping is not weak here.</p>
<h3 id="programmatically-yes-its-real">Programmatically, yes, it’s real</h3>
<p>A lot of vendors say “API” and mean one thin endpoint.</p>
<p>Visualping looks more serious than that.</p>
<p>Their April 2026 API article shows actual API usage for:
- creating jobs with <code>POST https://job.api.visualping.io/v2/jobs</code>
- setting intervals in minutes like <code>5</code>, <code>60</code>, and <code>1440</code>
- targeting a specific page region with <code>xpath</code>
- adding <code>preactions</code> for click and type steps
- configuring webhook notifications
- pulling active jobs and change history
- using AI importance definitions and summaries</p>
<p>That is enough for real operations work.</p>
<p>Once you get past ~30 monitors, the dashboard becomes the slow part. The API is how you stop doing repetitive setup by hand.</p>
<h3 id="but-integrations-are-not-insight">But integrations are not insight</h3>
<p>A Slack alert about a page change is still a page change.</p>
<p>Moving the alert into Slack, Teams, Sheets, Zapier, or n8n does not improve the information. It improves routing.</p>
<p>Useful. Yes.</p>
<p>The same as insight. No.</p>
<h3 id="business-plan-gating-matters">Business-plan gating matters</h3>
<p>Visualping’s help center is pretty clear here.</p>
<p>Business plans are for users who want to:
- scale to more pages and higher frequency
- collaborate in a shared dashboard
- organize workspaces and labels
- integrate with API, webhook, Sheets, Slack, and Teams</p>
<p><img alt="Visualping help doc showing Business-plan workflow features" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/a6bdf4098fbe.webp" /></p>
<p>That matters because it changes the buying math.</p>
<p>If you’re a solo operator, Personal may be enough.</p>
<p>If you’re plugging alerts into an actual team workflow, you are already in Business territory.</p>
<h2 id="bot-blocking-login-walls-and-edge-cases">Bot blocking, login walls, and edge cases</h2>
<p>This is where most reviews get vague. I’m not going to do that.</p>
<h3 id="behind-login-walls-yes-with-caveats">Behind login walls, yes, with caveats</h3>
<p>Visualping’s February 2026 guide on password-protected pages gives a clean table:</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>Best for</th>
<th>Difficulty</th>
<th>Works with 2FA?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chrome extension</td>
<td>Any authentication method, including 2FA and SSO</td>
<td>Easy</td>
<td>Yes</td>
</tr>
<tr>
<td>Pre-actions</td>
<td>Standard username/password forms</td>
<td>Medium</td>
<td>No</td>
</tr>
</tbody>
</table>
<p>That is a good answer.</p>
<p>The extension captures your active browser session. In <strong>Device mode</strong>, checks run on your machine. In <strong>Server mode</strong>, it captures session data like cookies and local storage and sends them to Visualping’s servers for background checks.</p>
<p>That means:
- <strong>2FA and SSO:</strong> yes, with the extension
- <strong>basic username/password:</strong> yes, with extension or pre-actions
- <strong>messy SPA login flows:</strong> more likely with extension
- <strong>expiring sessions:</strong> expect re-auth friction</p>
<p>That is real capability. Also real maintenance.</p>
<h3 id="bot-detection-no-they-are-not-pretending-to-be-bulletproof">Bot detection, no, they are not pretending to be bulletproof</h3>
<p>This is where I give them credit.</p>
<p>Their own guide says: <strong>“Some sites detect and block automated access.”</strong> The suggested workaround is the Chrome extension in <strong>Device mode</strong>, because it uses your real browser.</p>
<p>They also say pre-actions do <strong>not</strong> work with <strong>CAPTCHA-protected logins</strong>.</p>
<p>That is the right level of honesty.</p>
<p>Visualping is a monitoring tool. It is not a stealth anti-bot stack.</p>
<p>If your targets are consistently behind hostile bot defenses, this category gets harder fast.</p>
<h3 id="device-mode-vs-server-mode">Device mode vs server mode</h3>
<p>This is the actual tradeoff.</p>
<p><strong>Device mode</strong> is better when:
- the site dislikes bots
- auth is messy
- you need your real session
- you can tolerate checks only running while your machine and Chrome are alive</p>
<p><strong>Server mode</strong> is better when:
- you want background monitoring
- sessions do not expire too fast
- your laptop being closed should not stop the checks
- the target site is not especially hostile</p>
<p>If your process depends on Device mode, somebody owns that browser session. Usually RevOps. Sometimes the founder. Sometimes an engineer who did not ask for this job.</p>
<h3 id="advanced-use-cases">Advanced use cases</h3>
<p>Visualping is better than average when the workflow gets slightly weird.</p>
<p>Based on Visualping’s docs and TechRadar, the serious use cases include:
- monitoring after <strong>click</strong>, <strong>type</strong>, <strong>scroll</strong>, or <strong>wait</strong> actions
- watching <strong>specific elements</strong> instead of whole pages
- monitoring <strong>password-protected pages</strong>
- using <strong>custom AI importance definitions</strong>
- sending alerts through <strong>webhooks</strong>
- creating hundreds of monitors through the <strong>API</strong>
- tracking <strong>keywords</strong> instead of every visual change</p>
<p>That is a real feature surface.</p>
<p>Still, advanced page monitoring is still page monitoring.</p>
<h3 id="is-there-an-rss-feed">Is there an RSS feed?</h3>
<p>I could find strong first-party evidence for:
- email
- Slack
- Teams
- Google Sheets
- Google Chat
- Discord
- webhooks
- Zapier
- n8n
- API</p>
<p>I could <strong>not</strong> find first-party evidence of a native RSS output for Visualping alerts.</p>
<p>Can you build an RSS-like workflow from a webhook?</p>
<p>Yes.</p>
<p>Is that the same as native RSS?</p>
<p>No.</p>
<p>That matters if your team wants feed-style monitoring instead of notification routing.</p>
<p>This is one place where <a href="https://nubela.co/company-monitor?ref=nubela.co">NinjaPear Company Monitor</a> is a different kind of product. It is built around a company-updates feed from the start.</p>
<h2 id="my-scorecard">My scorecard</h2>
<table>
<thead>
<tr>
<th>Category</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ease of setup</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Visual clarity</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Dynamic page handling</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Behind-login support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Bot-blocking resilience</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>False positive control</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Meaningful signal extraction</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Integrations</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Developer friendliness</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Pricing efficiency</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Scalability for intel teams</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td><strong>Overall</strong></td>
<td><strong>3.1/5</strong></td>
</tr>
</tbody>
</table>
<p>That score is not a dunk. It is a fit score.</p>
<p>Visualping is good at a narrower job than many buyers want it to do.</p>
<h2 id="visualping-vs-distill-vs-changedetection">Visualping vs Distill vs changedetection</h2>
<h3 id="visualping-vs-distill">Visualping vs Distill</h3>
<p>Visualping is easier and more polished.</p>
<p>Distill tends to be better for people who want more control and do not mind more setup. Public pricing has also tended to look better for technical users who want faster intervals and more knobs per dollar.</p>
<p>My rough rule is simple:
- give <strong>Visualping</strong> to a non-technical operator
- give <strong>Distill</strong> to a power user who wants more control</p>
<h3 id="visualping-vs-changedetection">Visualping vs changedetection</h3>
<p>changedetection.io is the “I’d rather own the plumbing” option.</p>
<p>It is powerful. It is cheap. It is flexible. It is also work.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;flex-wrap:wrap;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/programming</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/maxupp</span>
<span style="color:#878a8c;">· ▲ n/a</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">There also exists this project https://github.com/dgtlmoon/changedetection.io which is self-hosted...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/programming/comments/ha054s/got_really_annoyed_with_visualpingio_last_night/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is basically the tradeoff.</p>
<p>Visualping is easier. changedetection.io is better if your team is technical and cost-sensitive.</p>
<h3 id="visualping-vs-ninjapear-monitor">Visualping vs NinjaPear Monitor</h3>
<p>This one is clean.</p>
<ul>
<li><strong>Visualping</strong> = page monitoring</li>
<li><strong><a href="https://nubela.co/company-monitor?ref=nubela.co">NinjaPear Company Monitor</a></strong> = company updates across website, blog, X, and meaningful changes</li>
</ul>
<p>If you want <strong>“did this page move?”</strong>, buy Visualping.</p>
<p>If you want <strong>“what is this company doing?”</strong>, buy a different class of tool.</p>
<p>That is why Company Monitor exists.</p>
<p>I got tired of teams forcing page diffs to do company-intel work.</p>
<h2 id="what-reddit-and-x-got-right">What Reddit and X got right</h2>
<h3 id="reddit-on-dynamic-pages">Reddit on dynamic pages</h3>
<p>The best Reddit quote I found is still the one about waiting for JS, clicking elements, and entering a zip code.</p>
<p>It’s short. It’s ugly. It’s believable.</p>
<p>And it proves the product can do more than static diffs.</p>
<h3 id="reddit-on-diy-alternatives">Reddit on DIY alternatives</h3>
<p>Reddit also gets the buyer split right.</p>
<p>Technical people compare Visualping with self-hosted options almost immediately. They should.</p>
<p>If Docker and selectors do not scare you, changedetection.io is worth a real look.</p>
<h3 id="x-on-practical-monitoring">X on practical monitoring</h3>
<p>I found one X post that captures a sane use case instead of pretending a page alert tool is a full intel system:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I use VisualPing to monitor changes on web pages.

No fancy integration. No scraping.
Just an alert when something changes.

I use it for:
- platform tweaks its docs
- competitor updates pricing
- goods price decrease 🤭

I get an email, and I’m already in the loop.</p>&mdash; Luca Restagno 🐢 blacktwist.app (@ikoichi) <a href="https://x.com/ikoichi/status/1950609850179965360?ref=nubela.co">Jul 30, 2025</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That is a good Visualping workflow. Narrow. Useful. No fantasy.</p>
<h2 id="screenshots-and-proof">Screenshots and proof</h2>
<h3 id="homepage-hero">Homepage hero</h3>
<p><img alt="Visualping homepage hero" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/3e3cc0d016da-1.webp" /></p>
<h3 id="integrations-proof">Integrations proof</h3>
<p><img alt="Visualping integrations screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/2bb672f22751-1.webp" /></p>
<h3 id="help-doc-proof">Help-doc proof</h3>
<p><img alt="Visualping help-doc screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/a6bdf4098fbe-1.webp" /></p>
<h2 id="evidence-table">Evidence table</h2>
<table>
<thead>
<tr>
<th>Claim</th>
<th>Source</th>
<th>Exact wording / evidence</th>
<th>Article takeaway</th>
</tr>
</thead>
<tbody>
<tr>
<td>Homepage positions Visualping as simple setup</td>
<td>https://visualping.io/</td>
<td>Hero shows URL input, “Click Go to take a snapshot,” alert setup, cadence, and email destination</td>
<td>Visualping’s UX is optimized for fast setup and non-technical use</td>
</tr>
<tr>
<td>Integrations exist for common workflow tools</td>
<td>https://visualping.io/integrations</td>
<td>Lists Slack, Microsoft Teams, Google Chat, Zapier, Google Sheets, Lindy.ai, n8n, Webhooks, Discord, API</td>
<td>Integrations are solid for normal business workflows</td>
</tr>
<tr>
<td>Integrations are Business-plan oriented</td>
<td>https://visualping.io/integrations</td>
<td>“Integrations are available in all Visualping for Business plans.”</td>
<td>Useful connectors, but they push team workflows upmarket</td>
</tr>
<tr>
<td>Business plans include workflow integrations</td>
<td>https://help.visualping.io/en/articles/6308929</td>
<td>“Integrate changes into their own custom workflow via our API, Webhook, Google Sheets, Slack, or MS Teams.”</td>
<td>API, webhook, Slack, and Sheets are part of the Business motion</td>
</tr>
<tr>
<td>Solutions includes AI interpretation help</td>
<td>https://help.visualping.io/en/articles/6308929</td>
<td>“AI concierge service... only notifies you when a change is important.”</td>
<td>Visualping knows raw change detection is not enough at scale</td>
</tr>
<tr>
<td>Login-wall monitoring is supported</td>
<td>https://visualping.io/blog/how-to-monitor-password-protected-websites-using-visualping</td>
<td>Supports Chrome extension and pre-actions; extension works with 2FA/SSO, pre-actions do not handle 2FA</td>
<td>Behind-login support is real, but method choice matters</td>
</tr>
<tr>
<td>Some sites block the crawler</td>
<td>https://visualping.io/blog/how-to-monitor-password-protected-websites-using-visualping</td>
<td>“Some sites detect and block automated access. The Chrome extension in Device mode avoids this because it uses your real browser.”</td>
<td>Bot-blocking resilience is limited in server-side mode</td>
</tr>
<tr>
<td>CAPTCHA is not handled by pre-actions</td>
<td>https://visualping.io/blog/how-to-monitor-password-protected-websites-using-visualping</td>
<td>“Pre-actions do not work with... CAPTCHA-protected logins”</td>
<td>This is not a full anti-bot platform</td>
</tr>
<tr>
<td>API is real, not decorative</td>
<td>https://visualping.io/blog/monitor-website-changes-api</td>
<td>Shows <code>POST https://job.api.visualping.io/v2/jobs</code>, job creation, webhooks, selectors, preactions, and change history</td>
<td>Serious teams can operationalize Visualping programmatically</td>
</tr>
<tr>
<td>TechRadar pricing context</td>
<td>https://www.techradar.com/reviews/visualping-web-content-monitoring</td>
<td>Free 150 checks/month and 5 pages; paid plans from $10 personal to $250 business</td>
<td>Public pricing context supports the workflow-purchase argument</td>
</tr>
<tr>
<td>Chrome Web Store free reference differs</td>
<td>https://chromewebstore.google.com/detail/visualping/pemhgklkefakciniebenbfclihhmmfcd?hl=en</td>
<td>“62 checks/month free” for server service</td>
<td>Free-tier references vary by surface and date</td>
</tr>
<tr>
<td>Native RSS output not clearly documented</td>
<td>research pass</td>
<td>Strong evidence for email, Slack, Teams, Sheets, webhooks, API, Discord, Zapier, and n8n, but no clear first-party native RSS feed doc found</td>
<td>Do not assume RSS exists as a native output</td>
</tr>
</tbody>
</table>
<h2 id="who-should-buy-it">Who should buy it</h2>
<h3 id="buy-visualping-if">Buy Visualping if</h3>
<p>Buy <strong>Visualping</strong> if:
- you’re a solo operator or small team
- you need simple page alerts
- you care about visual diffs
- your targets are mostly public web pages
- you want something non-technical people can set up quickly
- you may occasionally need login-wall monitoring and understand the caveats</p>
<h3 id="skip-visualping-if">Skip Visualping if</h3>
<p>Skip it, or at least don’t make it your main system, if:
- you need structured company intelligence
- you need website + blog + X + new-page coverage together
- you are trying to reduce analyst labor, not just detect movement
- your targets are behind hostile bot defenses or CAPTCHA-heavy auth flows
- you want a feed of meaningful company updates instead of screenshot diffs</p>
<h2 id="my-final-take">My final take</h2>
<p>Visualping is worth paying for when the job is page alerts.</p>
<p>That is my actual view. Not a hedge.</p>
<p>It is good software. It is easy to set up. It is more capable on dynamic and gated pages than a lot of people think. It also gets misbought all the time.</p>
<p>If your job is <strong>“alert me when this page changes,”</strong> Visualping is a reasonable answer.</p>
<p>If your job is <strong>“tell me what this company is doing,”</strong> it is the wrong layer.</p>
<p>That difference sounds small. It is not.</p>
<p>If you’re still deciding, do one boring exercise before you buy anything: list the pages you need to watch, the person who will review alerts, the action you’ll take when something changes, and whether those targets sit behind auth or bot friction. That will tell you very quickly whether you need a page monitor, a self-hosted setup, or a proper company-monitoring feed.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Website Monitoring Buyer Kit</strong><br>
<span style="color:#555;">A practical workbook with a vendor scorecard, cost estimator, false-positive tracker, implementation checklist, and page-vs-company decision tab.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/website-monitoring-buyer-kit-adf4eee0.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you want to sanity-check the category without buying the wrong layer first, that sheet will do more for you than another ten feature-list reviews.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Business Intelligence Guide for CEOs by a CEO in 2026 + Reddit Comments ]]></title>
        <description><![CDATA[ If I were buying a business intelligence platform in 2026, I’d start here: Power BI is still the safest default, Tableau is still best at visual analysis, Looker is still only worth it if you already have a real data team, Qlik is better than its market buzz, Sigma ]]></description>
        <link>https://nubela.co/blog/ultimate-business-intelligence-guide-for-ceos-2026/</link>
        <guid isPermaLink="false">69d9908a1ff0fe00015814c3</guid>
        <category><![CDATA[ business intelligence platform ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Sat, 11 Apr 2026 08:06:35 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_6.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If I were buying a <strong>business intelligence platform</strong> in 2026, I’d start here: <strong>Power BI is still the safest default, Tableau is still best at visual analysis, Looker is still only worth it if you already have a real data team, Qlik is better than its market buzz, Sigma is the modern pick, and most companies are paying for complexity they will never use.</strong> The license is not the expensive part. The mess you create six months later is.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/theungod</span>
<span style="color:#878a8c;">· ▲ 40</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I'd avoid Looker, as a current admin of both that and Tableau. Looker is way more expensive and much more complicated to use (LookML is its own language). If you have on-prem servers it's also difficult to set up connections.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1psxtxv/shifting_from_tableau_to_either_looker_or_powerbi/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>I like that quote because it gets to the point.</p>
<p>I’ve had to make this call with my own money. At FluxoMetric, I burned ~$4K a month on tools that looked great in demos and turned into chores in production. Later, at Meyer Growth Labs, I inherited BI setups that were already half-rotten. Nice dashboards. Bad models. Confused definitions. Nobody trusted the numbers.</p>
<p>That’s what this guide is about. Not features in isolation. Operating reality.</p>
<h2 id="tldr">TL;DR</h2>
<p>Here’s the fast shortlist for a <strong>business intelligence platform</strong> decision.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Power BI</th>
<th>Tableau</th>
<th>Looker</th>
<th>Qlik</th>
<th>Sigma</th>
<th>ThoughtSpot</th>
<th>Domo</th>
<th>Metabase</th>
<th>Zoho Analytics</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Best use case</td>
<td>Default buy</td>
<td>Visual analysis</td>
<td>Governed metrics</td>
<td>Underrated enterprise</td>
<td>Modern self-service</td>
<td>Search-first analytics</td>
<td>Fast rollout</td>
<td>Cheap/open source</td>
<td>SMB budget</td>
<td>Depends</td>
</tr>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆</td>
<td>⭐⭐⭐☆</td>
<td>⭐⭐⭐☆</td>
<td>⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Tableau</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Sigma / ThoughtSpot</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Looker</td>
</tr>
<tr>
<td>Scale</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Looker</td>
</tr>
<tr>
<td>Pricing sanity</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>Power BI / Metabase / Zoho</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Looker / Qlik / Sigma / Metabase</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Tie</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Looker / Sigma</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.9/5</strong></td>
<td><strong>3.7/5</strong></td>
<td><strong>4.1/5 right team, 2.8/5 wrong team</strong></td>
<td><strong>3.9/5</strong></td>
<td><strong>4.0/5</strong></td>
<td><strong>3.8/5</strong></td>
<td><strong>3.6/5</strong></td>
<td><strong>3.4/5</strong></td>
<td><strong>3.6/5</strong></td>
<td>Power BI default</td>
</tr>
</tbody>
</table>
<p>My short version:</p>
<ul>
<li><strong>Best default buy:</strong> Power BI</li>
<li><strong>Best visuals:</strong> Tableau</li>
<li><strong>Best governed metrics:</strong> Looker</li>
<li><strong>Most underrated:</strong> Qlik</li>
<li><strong>Best modern UX:</strong> Sigma</li>
<li><strong>Best search-first pick:</strong> ThoughtSpot</li>
<li><strong>Best fast-start dashboard stack:</strong> Domo</li>
<li><strong>Best cheap/open source option:</strong> Metabase</li>
<li><strong>Best SMB value:</strong> Zoho Analytics</li>
<li><strong>Best external company intelligence layer for BI:</strong> <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></li>
</ul>
<h2 id="why-most-bi-advice-sucks">Why most BI advice sucks</h2>
<p>Most <strong>business intelligence platform</strong> advice is written by one of three people:</p>
<ol>
<li>The vendor.</li>
<li>An affiliate writer.</li>
<li>Somebody who has never had to own a renewal.</li>
</ol>
<p>So you get a lot of words and not much help.</p>
<p>What matters is not whether a demo looks clean. What matters is whether the thing still works after the analyst who built the first dashboards leaves. What matters is whether finance hates the renewal. What matters is whether your org trusts the same metric in three places.</p>
<p>This is also where a lot of buying guides miss the real problem. They compare dashboard tools as if the dashboard layer is the whole job. It isn’t.</p>
<p>A <strong>business intelligence platform</strong> tells you what happened inside your company. A CEO also wants to know what changed outside the company. Competitor moves. Customer overlap. Org changes. Pricing changes. New hires. That is not something Tableau or Power BI invent for you. You need outside data for that.</p>
<h2 id="how-i-scored-them">How I scored them</h2>
<p>I scored these tools on operating reality, not demo quality.</p>
<p>That means I care about the following nine things:</p>
<ol>
<li><strong>Visualization quality</strong></li>
<li><strong>Self-service ease</strong></li>
<li><strong>Governance / semantic consistency</strong></li>
<li><strong>Scalability</strong></li>
<li><strong>Pricing sanity</strong></li>
<li><strong>Developer friendliness</strong></li>
<li><strong>Stability / admin sanity</strong></li>
<li><strong>Data freshness support</strong></li>
<li><strong>Fit for external intelligence workflows</strong></li>
</ol>
<p>The star ratings below are not about which vendor tells the prettiest story. They’re about what happens when normal people have to live with the thing.</p>
<h2 id="the-fast-answer">The fast answer</h2>
<h3 id="best-default-buy">Best default buy</h3>
<p><strong>Power BI</strong></p>
<p>This is still the default answer for most companies. Cheap enough. Familiar enough. Safe enough.</p>
<p>That doesn’t mean it’s clean. It means it’s survivable.</p>
<h3 id="best-for-visual-analysis">Best for visual analysis</h3>
<p><strong>Tableau</strong></p>
<p>Still the best visual analysis tool in the group. Still expensive. Still worth it for the right team.</p>
<h3 id="best-for-governed-metrics">Best for governed metrics</h3>
<p><strong>Looker</strong></p>
<p>If the real problem is trust and definition control, Looker deserves a serious look.</p>
<p>If your data stack is still loose, do not buy this.</p>
<h3 id="most-underrated-pick">Most underrated pick</h3>
<p><strong>Qlik</strong></p>
<p>Qlik gets ignored because it doesn’t win the popularity contest. Product-wise, that’s not fair.</p>
<h3 id="best-modern-challenger">Best modern challenger</h3>
<p><strong>Sigma</strong></p>
<p>Sigma is what a lot of warehouse-native teams hoped old-school BI would become.</p>
<h3 id="best-for-search-first-analytics">Best for search-first analytics</h3>
<p><strong>ThoughtSpot</strong></p>
<p>If people won’t learn dashboard navigation, search-first analytics is a real category.</p>
<h3 id="best-if-you-want-fast-setup">Best if you want fast setup</h3>
<p><strong>Domo</strong></p>
<p>You buy Domo for speed. That can be smart. It can also be how you buy yourself a cleanup project.</p>
<h3 id="best-open-source-cheap-option">Best open-source / cheap option</h3>
<p><strong>Metabase</strong></p>
<p>A lot of teams do not need an enterprise monster. Metabase is what “enough” looks like.</p>
<h3 id="best-budget-smb-option">Best budget SMB option</h3>
<p><strong>Zoho Analytics</strong></p>
<p>This gets ignored by enterprise-heavy roundups. It shouldn’t.</p>
<h2 id="power-bi-review">Power BI review</h2>
<p><strong>My score: ~3.9/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.9/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-it-keeps-winning">Why it keeps winning</h3>
<p>Power BI keeps winning because the buy is easier than the operation.</p>
<p>A few reasons:</p>
<ul>
<li>Public pricing is cheap relative to the field.</li>
<li>Microsoft already lives in a lot of companies.</li>
<li>Procurement is comfortable with it.</li>
<li>You can usually find internal users quickly.</li>
</ul>
<p>Microsoft’s public pricing shows <strong>Power BI Pro at $14/user/month</strong> and <strong>Premium Per User at $24/user/month</strong>.</p>
<p>That matters. A lot. Public pricing is how a tool gets into the room in the first place.</p>
<h3 id="where-it-gets-messy">Where it gets messy</h3>
<p>Power BI makes it easy to create analytics debt.</p>
<p>Not because it is bad. Because it is accessible.</p>
<p>The usual problems:</p>
<ul>
<li>DAX debt</li>
<li>model sprawl</li>
<li>sharing quirks</li>
<li>too many workarounds once the model gets complicated</li>
</ul>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/[deleted]</span>
<span style="color:#878a8c;">· ▲ 28</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">You gotta be really careful. You can solve today's problems with PowerBI, but this can easily snowball to technical debt, solving things quickly today will make issues tomorrow. Each model becomes its own bird's nest to untangle if some metric or underlying application changes.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/keklwj/power_bi_is_so_powerful_you_dont_even_need_an_etl/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/[deleted]</span>
<span style="color:#878a8c;">· ▲ 59</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">If your tables change often then you probably need an abstraction layer like “Views” that would make it easier to manage changes. Have PowerBI read from the views instead of directly from the tables... avoid using dax or power query if you can. Powerbi is slow when working with large data sets.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1c6b1vt/powerbi_limitations_and_best_practices/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">&quot;AI is killing Power BI and Tableau&quot;... no it&#39;s not.

No one wants your boutique custom dashboard interface.

They want something reliable, with data refreshes that work, that they can share with colleagues, that have admin, viewing, and collaboration features.</p>&mdash; Alex Freberg (@Alex_TheAnalyst) <a href="https://x.com/Alex_TheAnalyst/status/2041842277824200950?ref=nubela.co">April 8, 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Version 0.22.0 of the Power BI agentic development plugins have a new skill for DAX ... I recommend using the pbir-cli in an iterative way where you specify the requirements and formatting that you want. Avoid using open-ended, subjective prompts &quot;make a good report&quot; ... The tool doesn&#39;t think or design for you; it lets you focus on that part while it takes care of the formatting and tasks!</p>&mdash; Kurt Buhler (@kurtbuhler) <a href="https://x.com/kurtbuhler/status/2042622790289797577?ref=nubela.co">April 10, 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h3 id="pricing-reality">Pricing reality</h3>
<p>Verified public pricing:</p>
<ul>
<li><strong>Power BI Pro:</strong> $14/user/month</li>
<li><strong>Power BI Premium Per User:</strong> $24/user/month</li>
</ul>
<p>Source:</p>
<ul>
<li>Microsoft pricing page: <code>https://www.microsoft.com/en-us/power-platform/products/power-bi/pricing</code></li>
<li>Microsoft pricing update: <code>https://powerbi.microsoft.com/en-us/blog/important-update-to-microsoft-power-bi-pricing/</code></li>
</ul>
<h2 id="tableau-review">Tableau review</h2>
<p><strong>My score: ~3.7/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.7/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-analysts-still-love-it">Why analysts still love it</h3>
<p>Tableau still has the best visual instincts in the group.</p>
<p>It gives analysts range. It gives presentations shape. It gives exploratory work room to breathe.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/tableau</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/[deleted]</span>
<span style="color:#878a8c;">· ▲ 21</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Tableau is still "the" industry standard, as far as I can tell. I have been using it for 6 years now.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/tableau/comments/1fatl2w/is_tableau_still_alive/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Zealousideal-Kale532</span>
<span style="color:#878a8c;">· ▲ 7</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Tableau. But Power BI is a close second!</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1liwsj6/what_is_your_favorite_data_visualization_bi_tool/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is basically the market in one sentence.</p>
<h3 id="why-finance-hates-the-invoice">Why finance hates the invoice</h3>
<p>Tableau’s problem is not quality. It’s the bill.</p>
<p>Public pricing on Tableau’s pricing page:</p>
<ul>
<li><strong>Standard Viewer:</strong> $15/user/month billed annually</li>
<li><strong>Standard Explorer:</strong> $42/user/month billed annually</li>
<li><strong>Standard Creator:</strong> $75/user/month billed annually</li>
<li><strong>Enterprise Viewer:</strong> $35/user/month billed annually</li>
<li><strong>Enterprise Explorer:</strong> $70/user/month billed annually</li>
<li><strong>Enterprise Creator:</strong> $115/user/month billed annually</li>
</ul>
<p>A 10 Creator, 20 Explorer, 100 Viewer Standard deployment comes out to <strong>$34,080/year</strong> before services or extras.</p>
<p>That is why finance groans.</p>
<h3 id="pricing-screenshots">Pricing screenshots</h3>
<p><img alt="Tableau pricing page, overview" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/bdaed682cf4b.webp" /></p>
<p><em>Tableau pricing page, captured from <code>https://www.tableau.com/pricing</code>. Public list pricing shows Standard and Enterprise starting prices.</em></p>
<p><img alt="Tableau pricing page, role details" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/ebc4bb312676.webp" /></p>
<p><em>Second Tableau pricing capture from the same public page. This view shows the role-based licensing detail, which is where the invoice starts to hurt.</em></p>
<h2 id="looker-review">Looker review</h2>
<p><strong>My score: ~4.1/5 for the right team, ~2.8/5 for the wrong one</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Average</td>
<td><strong>4.1/5 right team, 2.8/5 wrong team</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-serious-data-teams-still-buy-it">Why serious data teams still buy it</h3>
<p>LookML is both the feature and the tax.</p>
<p>If you already run a real warehouse, have dbt or equivalent, and care more about trusted definitions than pretty charts, Looker makes sense.</p>
<p>Google Cloud publishes useful packaging details even though it does not publish simple list pricing:</p>
<ul>
<li><strong>Standard</strong> includes 10 standard users, 2 developer users, 1,000 query-based API calls/month, and 1,000 admin API calls/month</li>
<li><strong>Enterprise</strong> includes 100,000 query-based API calls/month and 10,000 admin API calls/month</li>
<li>both editions include ten standard users and two developer users</li>
</ul>
<p>That API quota detail matters if you want to feed external data into the warehouse and then operationalize it.</p>
<h3 id="why-most-teams-should-not-touch-it">Why most teams should not touch it</h3>
<p>Looker is not bad. It’s just expensive in the wrong hands.</p>
<p>If your org is still part spreadsheet and part improvisation, you do not need LookML. You need discipline.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Mountain-Car-1515</span>
<span style="color:#878a8c;">· ▲ 25</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Everything has to be put into a data warehouse first, which Looker directly connects to and queries. You have to know LookML, which is another language, to do the modeling and metric creation. Looker usually is the more expensive option.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/ujmmdp/what_are_the_main_limitations_of_looker_compared/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the honest summary.</p>
<h3 id="packaging-screenshot">Packaging screenshot</h3>
<p><img alt="Looker pricing and edition page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/a6a9898a45b4.webp" /></p>
<p><em>Google Cloud Looker pricing page, captured from <code>https://cloud.google.com/looker/pricing</code>. Google does not publish simple dollar pricing, but it does publish edition entitlements and API quotas.</em></p>
<h2 id="qlik-review">Qlik review</h2>
<p><strong>My score: ~3.9/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.9/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-qlik-deserves-more-respect">Why Qlik deserves more respect</h3>
<p>Qlik is the one people forget.</p>
<p>Usually because it doesn’t win the popularity contest.</p>
<p>That has very little to do with product quality.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/theoriginalmantooth</span>
<span style="color:#878a8c;">· ▲ 17</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">As a Tableau Developer for more than 6 years, QlikView impressed me. The amount of control it gives to the creator is next level. The pixel-perfect formatting, the ability to write extensive data manipulation scripts and the associative engine.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1czg1qx/which_bi_tools_impressed_you_the_most_excluding/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is why I keep calling Qlik underrated.</p>
<h3 id="pricing-reality">Pricing reality</h3>
<p>Qlik publishes actual numbers. Good.</p>
<ul>
<li><strong>Starter:</strong> $300/month</li>
<li><strong>Standard:</strong> $825/month</li>
<li><strong>Premium:</strong> $2,750/month</li>
<li><strong>Enterprise:</strong> contact sales</li>
</ul>
<h3 id="pricing-screenshots">Pricing screenshots</h3>
<p><img alt="Qlik pricing page, primary capture" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/44b234821918.webp" /></p>
<p><em>Qlik Cloud Analytics pricing page, captured from <code>https://www.qlik.com/us/pricing</code>. Starter, Standard, Premium, then enterprise quote.</em></p>
<p><img alt="Qlik pricing page, alternate capture" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e9ad1128f2ac.webp" /></p>
<p><em>Second Qlik capture from the same public pricing page. This view makes the capacity framing clearer.</em></p>
<h2 id="sigma-review">Sigma review</h2>
<p><strong>My score: ~4.0/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Average</td>
<td><strong>4.0/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-sigma-feels-fresh">Why Sigma feels fresh</h3>
<p>Sigma reduces fear.</p>
<p>That sounds small. It isn’t.</p>
<p>The spreadsheet metaphor helps normal business users do more without a ceremony.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Kimber976</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Sigma is awesome</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1ou2snl/what_newer_or_lesserknown_bi_tools_have_actually/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Ok-Working3200</span>
<span style="color:#878a8c;">· ▲ 4</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">My job recently did a POC with Sigma. I loved the product. Significantly easier to do complicated calculations compared to Power BI. I prefer the browser based first BI tools.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1lk2en4/anyone_with_experience_with_sigma_bi/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h3 id="the-tradeoff-nobody-mentions">The tradeoff nobody mentions</h3>
<p>Sigma does not fix a bad model.</p>
<p>It also pushes you into the real warehouse-cost conversation faster than a lot of buyers expect.</p>
<p>Custom pricing does not help.</p>
<h2 id="thoughtspot-review">ThoughtSpot review</h2>
<p><strong>My score: ~3.8/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.8/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-it-matters">Why it matters</h3>
<p>ThoughtSpot matters because most BI adoption problems are friction problems.</p>
<p>If users can ask questions instead of learning a dashboard maze, that helps.</p>
<h3 id="where-it-breaks">Where it breaks</h3>
<p>Search does not rescue broken source data.</p>
<p>If your definitions are weak, the search bar just gets you to bad answers faster.</p>
<h2 id="domo-review">Domo review</h2>
<p><strong>My score: ~3.6/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.6/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-people-buy-it">Why people buy it</h3>
<p>Domo sells speed.</p>
<p>That’s a real advantage.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Kimber976</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Dashboards have been a lot smoother lately with tools I've tried and Domo in particular makes connecting different data sources pretty easy.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1ou2snl/what_newer_or_lesserknown_bi_tools_have_actually/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>

<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Appropriateman1</span>
<span style="color:#878a8c;">· ▲ 47</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">In any BI tool, you’ll need to ensure your data is clean, integrated, and curated... Domo has one-click integrations with most CRMs, GA4 and data warehouses like Snowflake. So if you want fastest, find the one with the integrations you need.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1ox327b/which_analytics_platform_is_the_fastest_setup_for/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h3 id="why-im-cautious">Why I’m cautious</h3>
<p>If speed is the whole buying case, you are probably skipping a harder conversation about data discipline.</p>
<p>That tends to come back later.</p>
<h2 id="sisense-review">Sisense review</h2>
<p><strong>My score: ~3.6/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.6/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="where-sisense-is-strong">Where Sisense is strong</h3>
<p>Sisense is still relevant for embedded analytics.</p>
<p>That is its lane.</p>
<h3 id="where-it-gets-tricky">Where it gets tricky</h3>
<p>If you are not embedding analytics into a product, I usually find a better default elsewhere.</p>
<h2 id="metabase-review">Metabase review</h2>
<p><strong>My score: ~3.4/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐☆☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.4/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-i-like-it">Why I like it</h3>
<p>Metabase has restraint.</p>
<p>That sounds basic. It’s rare.</p>
<p>Public pricing on the Metabase pricing page:</p>
<ul>
<li><strong>Open Source:</strong> free</li>
<li><strong>Starter:</strong> $100/month plus $5 per user monthly, or $1080/year plus $65 per user yearly</li>
<li><strong>Pro:</strong> $575/month plus $12 per user monthly, or $6210/year plus $130 per user yearly</li>
<li><strong>Enterprise:</strong> custom pricing, starts at $20k/year</li>
</ul>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/dataengineering</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/financialthrowaw2020</span>
<span style="color:#878a8c;">· ▲ 68</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Metabase is open source and great to use.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/dataengineering/comments/1jp7anp/what_is_the_best_free_bi_dashboarding_tool/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h3 id="where-it-stops-being-enough">Where it stops being enough</h3>
<p>Heavy governance. Broader semantic control. Polished exec presentation. That’s where Metabase starts to run out of road.</p>
<p><img alt="Metabase pricing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e780975d5126.webp" /></p>
<p><em>Metabase pricing page, captured from <code>https://www.metabase.com/pricing/</code>. Public pricing is refreshingly explicit, including the point where Enterprise starts at $20k/year.</em></p>
<h2 id="zoho-analytics-review">Zoho Analytics review</h2>
<p><strong>My score: ~3.6/5</strong></p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
<tr>
<td>Visuals</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Self-service</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Governance</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Dev friendliness</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Data freshness support</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>External intelligence fit</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Average</td>
<td><strong>3.6/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="why-it-makes-sense">Why it makes sense</h3>
<p>Zoho Analytics makes sense for teams that need sane reporting and do not need prestige.</p>
<p>From the public pricing page I captured, annual cloud pricing is listed in SGD as:</p>
<ul>
<li><strong>Basic:</strong> S$32/month billed annually</li>
<li><strong>Standard:</strong> S$64/month billed annually</li>
<li><strong>Premium:</strong> S$160/month billed annually</li>
<li><strong>Enterprise:</strong> S$632/month billed annually</li>
</ul>
<h3 id="why-it-is-not-the-answer-for-everyone">Why it is not the answer for everyone</h3>
<p>At the top end, this is not where I’d go for the strongest governance or warehouse-native work.</p>
<p>For SMBs, that may not matter.</p>
<p><img alt="Zoho Analytics pricing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/364651ac77db.webp" /></p>
<p><em>Zoho Analytics pricing page, captured from <code>https://www.zoho.com/analytics/pricing.html</code>. Screenshot shows public annual cloud pricing and plan limits.</em></p>
<h2 id="oracle-and-cognos-quick-take">Oracle and Cognos quick take</h2>
<h3 id="oracle-analytics">Oracle Analytics</h3>
<p>Still relevant in Oracle-heavy environments. Usually not pleasant.</p>
<p>If the rest of your estate is already Oracle, it can be rational.</p>
<h3 id="ibm-cognos">IBM Cognos</h3>
<p>Still alive. Still more likely to be inherited than loved.</p>
<p>If you are doing a fresh mid-market evaluation, this is rarely where I’d start.</p>
<h2 id="sap-and-microstrategy-quick-take">SAP and MicroStrategy quick take</h2>
<h3 id="sap-businessobjects">SAP BusinessObjects</h3>
<p>Still around in SAP-heavy shops. More often inherited than freshly chosen.</p>
<h3 id="microstrategy-strategy">MicroStrategy / Strategy</h3>
<p>Powerful. Heavy. Usually more than smaller teams need.</p>
<p>This tweet is from the vendor side, so I read it with that in mind. Still, the underlying complaint is real: metric fragmentation and tool sprawl are often the actual problem.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Most organizations are still dealing with fragmented BI stacks, inconsistent definitions, and rising infrastructure costs. The result is slower insights, duplicated work, and missed opportunities.

Strategy’s semantic layer, Mosaic, changes that by standardizing metrics, reducing tool sprawl, and creating a governed foundation for analytics and AI.</p>&mdash; Strategy (@MicroStrategy) <a href="https://x.com/MicroStrategy/status/2041848811740356629?ref=nubela.co">April 8, 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="bi-data-vendors-worth-adding">BI data vendors worth adding</h2>
<p>This is where a lot of <strong>business intelligence platform</strong> buyers get it wrong.</p>
<p>They buy a dashboard tool and think they bought business intelligence.</p>
<p>They didn’t.</p>
<h3 id="why-bi-buyers-get-this-wrong">Why BI buyers get this wrong</h3>
<p>A BI platform tells you what happened inside your company.</p>
<p>If you want to know what changed outside your company, you need outside data.</p>
<p>That means things like:</p>
<ul>
<li>competitor launches</li>
<li>customer overlap</li>
<li>account expansion signals</li>
<li>org changes</li>
<li>pricing changes</li>
<li>funding changes</li>
<li>intent signals</li>
</ul>
<p>Without that layer, a lot of BI rollouts are just internal reporting with nicer formatting.</p>
<h3 id="the-vendor-categories">The vendor categories</h3>
<p>I’d break the market into a few buckets:</p>
<ul>
<li><strong>Company intelligence:</strong> NinjaPear, ZoomInfo, Crunchbase</li>
<li><strong>Sales data / prospecting:</strong> Apollo, Cognism, Lead411</li>
<li><strong>ABM / intent:</strong> 6sense, Demandbase</li>
<li><strong>Data plumbing / orchestration:</strong> Clay</li>
<li><strong>Technographic / context tools:</strong> BuiltWith, Similarweb</li>
</ul>
<h3 id="quick-takes-by-vendor">Quick takes by vendor</h3>
<h4 id="ninjapear">NinjaPear</h4>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is the one I’d look at when the job is fresh company relationship data plus change monitoring.</p>
<p>It is API-first. That matters.</p>
<p>It turns a company domain into things like:</p>
<ul>
<li>customers, investors, and partners</li>
<li>competitors</li>
<li>company details and employee count</li>
<li>company updates</li>
<li>employee profiles</li>
</ul>
<p>That is useful if you want to feed a BI stack instead of forcing people to do manual research.</p>
<h4 id="zoominfo">ZoomInfo</h4>
<p>Strong brand. Large sales-intelligence footprint. Usually expensive.</p>
<p>Good if you need classic enterprise sales data. Often overbought.</p>
<h4 id="apollo">Apollo</h4>
<p>Cheaper and easier to access than ZoomInfo. Popular with startups.</p>
<p>Good prospecting tool. Not a full BI data layer.</p>
<h4 id="crunchbase">Crunchbase</h4>
<p>Useful for funding and investor context.</p>
<p>Helpful. Not enough by itself.</p>
<h4 id="6sense-demandbase">6sense / Demandbase</h4>
<p>Relevant when intent and ABM workflow matter.</p>
<p>Different job from simple enrichment.</p>
<h4 id="clay">Clay</h4>
<p>Excellent orchestration layer.</p>
<p>Not your source of truth.</p>
<h2 id="how-ninjapear-fits-your-bi-stack">How NinjaPear fits your BI stack</h2>
<h3 id="the-simple-version">The simple version</h3>
<p>A BI platform tells you what happened inside your company. <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> helps tell you what changed outside it.</p>
<p>That is the useful distinction.</p>
<h3 id="what-data-from-ninjapear-can-feed-bi-dashboards">What data from NinjaPear can feed BI dashboards</h3>
<p>From the public product pages and docs, the obvious inputs are:</p>
<ul>
<li>customer listing data for competitor-customer overlap dashboards</li>
<li>competitor listing data for market mapping</li>
<li>company updates data for change-monitoring dashboards</li>
<li>employee / person profile data for org-change tracking</li>
<li>company details and employee count for segmentation and enrichment</li>
</ul>
<p>There are also practical details BI teams care about:</p>
<ul>
<li>official JS and Python libraries</li>
<li>bearer-token auth</li>
<li>backward-compatibility guarantees</li>
<li>rate limits up to <strong>300 requests/minute</strong></li>
<li>endpoint response expectations of <strong>30 to 60 seconds</strong></li>
<li>explicit credit costs on endpoints</li>
</ul>
<p>That last part matters if you want to wire this into a refresh schedule and not get surprised later.</p>
<h3 id="example-workflows">Example workflows</h3>
<h4 id="power-bi-ninjapear">Power BI + NinjaPear</h4>
<p>Use NinjaPear API outputs as a scheduled source for competitor and customer monitoring dashboards.</p>
<h4 id="tableau-ninjapear">Tableau + NinjaPear</h4>
<p>Use relationship data to build overlap maps and segment heatmaps.</p>
<h4 id="looker-ninjapear">Looker + NinjaPear</h4>
<p>Model external company intelligence in the warehouse, then govern it the same way you govern internal data.</p>
<h4 id="sigma-ninjapear">Sigma + NinjaPear</h4>
<p>Let RevOps or finance explore relationship data in a spreadsheet-like interface.</p>
<h3 id="why-this-matters">Why this matters</h3>
<p>This is not a forced product mention. It solves a real gap.</p>
<p>Most BI tools are good at internal reporting. They are weak at ingesting market intelligence unless you add another layer.</p>
<pre><code class="language-text">NinjaPear API
  -&gt; warehouse or connector layer
  -&gt; modeled tables / semantic layer
  -&gt; Power BI / Tableau / Looker / Sigma dashboard
</code></pre>
<p>Useful fields to model:</p>
<ul>
<li><code>customers</code></li>
<li><code>competitors</code></li>
<li><code>employee_count</code></li>
<li><code>company_updates</code></li>
<li><code>person_profile</code></li>
</ul>
<p><img alt="NinjaPear homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/1762f6354a0a.webp" /></p>
<p><em>NinjaPear homepage, captured from <code>https://nubela.co/</code>. This is the cleanest quick visual of the product’s customers, competitors, and employees data model.</em></p>
<p><img alt="NinjaPear Company Monitor" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/8d1a11847199.webp" /></p>
<p><em>NinjaPear Company Monitor page, captured from <code>https://nubela.co/company-monitor</code>. This is outside-world change data in a form you can actually use.</em></p>
<p><img alt="NinjaPear Employee API" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/042b0184a03b.webp" /></p>
<p><em>NinjaPear Employee API page, captured from <code>https://nubela.co/employee-api</code>. Publicly sourced person-profile data is useful for org mapping and account intelligence workflows.</em></p>
<h2 id="side-by-side-scorecard">Side-by-side scorecard</h2>
<h3 id="bi-platform-comparison-table">BI platform comparison table</h3>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th>Worst for</th>
<th>Visuals</th>
<th>Self-service</th>
<th>Governance</th>
<th>Scale</th>
<th>Pricing</th>
<th>Dev friendliness</th>
<th>Stability</th>
<th>External intelligence fit</th>
<th>Average score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Power BI</td>
<td>Default enterprise buy</td>
<td>Teams that let DAX sprawl unchecked</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.9/5</strong></td>
</tr>
<tr>
<td>Tableau</td>
<td>Visual analysis</td>
<td>Budget-sensitive dashboard consumption</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.7/5</strong></td>
</tr>
<tr>
<td>Looker</td>
<td>Governed metrics</td>
<td>Spreadsheet-era orgs</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>4.1/5 right fit</strong></td>
</tr>
<tr>
<td>Qlik</td>
<td>Underrated enterprise BI</td>
<td>Simple seat-based buyers</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.9/5</strong></td>
</tr>
<tr>
<td>Sigma</td>
<td>Warehouse-native self-service</td>
<td>Teams with bad models</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>4.0/5</strong></td>
</tr>
<tr>
<td>ThoughtSpot</td>
<td>Search-first adoption</td>
<td>Weakly governed source data</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.8/5</strong></td>
</tr>
<tr>
<td>Domo</td>
<td>Fast executive rollout</td>
<td>Long-term cost control</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.6/5</strong></td>
</tr>
<tr>
<td>Sisense</td>
<td>Embedded analytics</td>
<td>Generic internal BI rollouts</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.6/5</strong></td>
</tr>
<tr>
<td>Metabase</td>
<td>Cheap/open source dashboards</td>
<td>Heavy enterprise governance</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td>Zoho Analytics</td>
<td>SMB value</td>
<td>Top-end enterprise scale</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.6/5</strong></td>
</tr>
</tbody>
</table>
<h3 id="data-vendor-comparison-table">Data vendor comparison table</h3>
<table>
<thead>
<tr>
<th>Vendor</th>
<th>Best for</th>
<th>Data freshness</th>
<th>Data richness</th>
<th>Scalability</th>
<th>Pricing sanity</th>
<th>Dev friendliness</th>
<th>Stability</th>
<th>Average score</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear</td>
<td>External company intelligence for BI</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.5/5</strong></td>
</tr>
<tr>
<td>ZoomInfo</td>
<td>Enterprise sales intelligence</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.8/5</strong></td>
</tr>
<tr>
<td>Apollo</td>
<td>Startup-friendly prospecting</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.7/5</strong></td>
</tr>
<tr>
<td>Crunchbase</td>
<td>Funding and investor context</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.5/5</strong></td>
</tr>
<tr>
<td>6sense</td>
<td>Intent + ABM orchestration</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.7/5</strong></td>
</tr>
<tr>
<td>Demandbase</td>
<td>ABM + account signals</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.7/5</strong></td>
</tr>
<tr>
<td>Clay</td>
<td>Enrichment orchestration</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.8/5</strong></td>
</tr>
<tr>
<td>BuiltWith</td>
<td>Technographics</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.7/5</strong></td>
</tr>
</tbody>
</table>
<h2 id="costs-nobody-warns-you-about">Costs nobody warns you about</h2>
<h3 id="migration-rebuild-costs">Migration rebuild costs</h3>
<p>Switching BI tools is often a rebuild, not a migration.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/BusinessIntelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/staatsclaas</span>
<span style="color:#878a8c;">· ▲ 84</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Power BI and then just blame Microsoft for all the problems that come from “migrating” because you get to rebuild everything.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/BusinessIntelligence/comments/1psxtxv/shifting_from_tableau_to_either_looker_or_powerbi/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Funny. Also true.</p>
<p>Budget for rebuild, validation, training, and political fallout. Not just licenses.</p>
<h3 id="semantic-layer-upkeep">Semantic layer upkeep</h3>
<p>If nobody owns metric definitions, your BI problem is a trust problem.</p>
<p>That is why Looker can be worth it for the right company. It is also why Power BI can quietly become definition chaos.</p>
<h3 id="dashboard-sprawl">Dashboard sprawl</h3>
<p>Everyone builds. Nobody deletes. Then nobody trusts anything.</p>
<p>I’ve seen companies with 400+ dashboards and no answer to which 20 matter.</p>
<h3 id="warehouse-spillover">Warehouse spillover</h3>
<p>A cheap BI layer on top of expensive warehouse queries is not cheap.</p>
<p>Sigma and Looker buyers should be especially careful here.</p>
<h3 id="training-and-adoption">Training and adoption</h3>
<p>The best tool on paper dies if nobody uses it.</p>
<p>ThoughtSpot can help adoption. Sigma can help adoption. Tableau can hurt adoption if the org mainly needs consumption, not exploration. Power BI often wins on familiarity.</p>
<h3 id="procurement-lock-in">Procurement lock-in</h3>
<p>Enterprise BI contracts love annual commitments and vague overage terms.</p>
<p>Public pricing is not the whole truth. But it gives you an anchor.</p>
<h2 id="what-id-buy-by-company-type">What I’d buy by company type</h2>
<h3 id="tiny-startup">Tiny startup</h3>
<p>Do not buy an enterprise BI platform just because a demo made you feel small.</p>
<p>My picks:</p>
<ul>
<li><strong>Best default:</strong> Metabase or Power BI</li>
<li><strong>If warehouse-native:</strong> Sigma</li>
<li><strong>If outside market data matters more than internal reporting:</strong> pair a light BI layer with NinjaPear</li>
</ul>
<h3 id="10-to-50-person-saas-team">10 to 50 person SaaS team</h3>
<ul>
<li><strong>Best default:</strong> Power BI</li>
<li><strong>Best modern warehouse option:</strong> Sigma</li>
<li><strong>Best if visual storytelling matters:</strong> Tableau</li>
<li><strong>Add NinjaPear if sales or strategy needs competitor/customer intelligence</strong></li>
</ul>
<h3 id="mid-market-ops-team">Mid-market ops team</h3>
<ul>
<li><strong>Default:</strong> Power BI</li>
<li><strong>Smarter shortlist:</strong> Power BI, Qlik, Sigma</li>
<li><strong>If governance pain is real:</strong> Looker</li>
<li><strong>If embedded or external dashboards matter:</strong> Sisense or Domo</li>
</ul>
<h3 id="enterprise-with-governance-pain">Enterprise with governance pain</h3>
<ul>
<li><strong>Looker or Qlik deserve a serious look</strong></li>
<li><strong>Power BI works if the org can actually govern it</strong></li>
<li><strong>Tableau is not a governance shortcut</strong></li>
<li><strong>Oracle, Cognos, and SAP stay relevant if you are already deep in those estates</strong></li>
<li><strong>Layer NinjaPear in when executive dashboards need outside-world company intelligence</strong></li>
</ul>
<h2 id="final-verdict">Final verdict</h2>
<p>Here’s my final answer if you’re buying a <strong>business intelligence platform</strong> in 2026.</p>
<ul>
<li><strong>Best default buy:</strong> Power BI</li>
<li><strong>Best visuals:</strong> Tableau</li>
<li><strong>Best for governed metrics:</strong> Looker</li>
<li><strong>Most underrated:</strong> Qlik</li>
<li><strong>Best modern UX:</strong> Sigma</li>
<li><strong>Best for search-first analytics:</strong> ThoughtSpot</li>
<li><strong>Best fast-start executive dashboard option:</strong> Domo</li>
<li><strong>Best open-source budget choice:</strong> Metabase</li>
<li><strong>Best SMB value choice:</strong> Zoho Analytics</li>
<li><strong>Best external company intelligence layer for BI dashboards:</strong> NinjaPear</li>
</ul>
<p>The best business intelligence platform is not the one with the slickest demo. It’s the one your team can still trust, afford, and operate 18 months later.</p>
<p>And if you want actual business intelligence instead of internal reporting cosplay, feed it better outside-world data.</p>
<p>If you’re making this decision now, pick three tools max. Test them on your real seat mix, your real data maturity, and one external-intelligence use case. That will tell you more than ten demos will.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: BI Platform Shortlist Worksheet for CEOs</strong><br>
<span style="color:#555;">Use it to run seat math, sanity-check hidden costs, score vendor fit, and plan the external-data layer before procurement gets weird.</span><br>
<a href="https://example.com/bi-platform-shortlist-worksheet?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Lookup a Person in 2026: The Fastest Way to Find the Right Record Without Paying for Junk ]]></title>
        <description><![CDATA[ If you want the blunt answer, here it is: TruePeopleSearch is the best free-first way to lookup a person by basic consumer data, Social Catfish is better when you&#39;re trying to verify whether someone is real, Searchbug is better when you need denser public-record style detail, Whitepages is ]]></description>
        <link>https://nubela.co/blog/lookup-person/</link>
        <guid isPermaLink="false">69d8f53c1ff0fe00015814bb</guid>
        <category><![CDATA[ lookup person ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Fri, 10 Apr 2026 21:03:56 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_5.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you want the blunt answer, here it is: <strong>TruePeopleSearch is the best free-first way to lookup a person by basic consumer data, Social Catfish is better when you're trying to verify whether someone is real, Searchbug is better when you need denser public-record style detail, Whitepages is the familiar mainstream option with a bigger free-to-paid split, and <a href="https://nubela.co/employee-api?ref=nubela.co">NinjaPear Employee API</a> is the right tool when <code>lookup person</code> really means professional profile lookup from a work email or company context.</strong> The mistake is assuming one tool does all of that well. It doesn't.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SocialEngineering</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/anonymous1512</span>
<span style="color:#878a8c;">· ▲ 80</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">They make a huge smoke-and-mirrors show that takes 5 minutes of stupid animations...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SocialEngineering/comments/agiept/no_bullshit_people_search_sites/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is the whole market in one sentence. Most pages ranking for <code>lookup person</code> are not trying to help you decide anything. They want you to type a name, sit through fake progress, and then pay before you've learned whether you're even on the right person.</p>
<h2 id="tldr">TL;DR</h2>
<p>If you just want the shortest honest answer for <strong>lookup person</strong>, start here.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>TruePeopleSearch</th>
<th>Social Catfish</th>
<th>Searchbug</th>
<th>Whitepages</th>
<th>NinjaPear</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Best input fit</td>
<td>Name, phone, address</td>
<td>Photo, username, email, phone</td>
<td>Name, address, old phone</td>
<td>Name, address, broad U.S. lookup</td>
<td>Work email, name+employer, role+company</td>
<td>Depends on input</td>
</tr>
<tr>
<td>Free starting value</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>TruePeopleSearch</td>
</tr>
<tr>
<td>Scam verification</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>Social Catfish</td>
</tr>
<tr>
<td>Deep record detail</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>☆☆☆☆☆</td>
<td>Searchbug</td>
</tr>
<tr>
<td>Professional lookup</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>☆☆☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Pricing clarity</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Searchbug</td>
</tr>
<tr>
<td>Ease of use</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Tie</td>
</tr>
<tr>
<td>Input flexibility</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Social Catfish</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.43/5</strong></td>
<td><strong>3.71/5</strong></td>
<td><strong>3.43/5</strong></td>
<td><strong>3.29/5</strong></td>
<td><strong>3.57/5</strong></td>
<td>Social Catfish for verification, NinjaPear for work context</td>
</tr>
</tbody>
</table>
<p>My actual summary is simpler than the table:</p>
<ul>
<li><strong>Name or phone, low stakes, no budget:</strong> start with TruePeopleSearch.</li>
<li><strong>Photo, username, email, or scam vibes:</strong> start with Social Catfish.</li>
<li><strong>You want denser U.S. record detail and don't mind paying per pull:</strong> use Searchbug.</li>
<li><strong>You want a mainstream directory with broad U.S. coverage:</strong> Whitepages is fine, just know the free tier is a preview.</li>
<li><strong>You have work context:</strong> use NinjaPear, not a consumer people-search site trying to pretend it understands professional identity.</li>
</ul>
<h2 id="skip-the-teaser-funnels">Skip the teaser funnels</h2>
<p>The first thing to understand is that most people-search sites are not really educational products. They are search boxes attached to a sales funnel.</p>
<p>Whitepages is at least direct about it. Its people search page says it covers <strong>more than 250 million U.S. adults</strong>, uses <strong>public records, court filings, utility records, and premium data partners</strong>, and splits output into <strong>free</strong> and <strong>premium</strong> results. Good. That's useful information.</p>
<p>Social Catfish is also fairly plain about the model. It says you can <strong>start a search for free and preview potential matches</strong>, but you may need a <strong>paid plan</strong> to unlock deeper results. Again, fine. I can work with that.</p>
<p>The problem isn't that these businesses charge money. The problem is that too many sites spend more effort manufacturing suspense than helping you pick the right workflow.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SocialEngineering</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/anonymous1512</span>
<span style="color:#878a8c;">· ▲ 80</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">OK, we all know the drill... they make a huge smoke-and-mirrors show... then ANOTHER 5 minutes... and yet ANOTHER 5 minutes to ‘confirm’ after you buy the search.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SocialEngineering/comments/agiept/no_bullshit_people_search_sites/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That's why I think organizing <code>lookup person</code> by <strong>input</strong> is the only sane way to do it. Not by brand. Not by whoever spent the most on SEO pages.</p>
<h2 id="start-with-your-input">Start with your input</h2>
<p>This is the real frame.</p>
<p>The best <code>lookup person</code> workflow depends on what you already have in hand. If all I have is a phone number, starting with a name-only directory is backwards. If I have a work email, starting with Whitepages is also backwards.</p>
<h3 id="name-only">Name only</h3>
<p>Name-only searches are where most people burn time.</p>
<p>If all you have is a name, narrow before you pay. Use:</p>
<ul>
<li>city or last known city</li>
<li>state</li>
<li>age band</li>
<li>relative name</li>
<li>old address</li>
<li>employer</li>
<li>school</li>
</ul>
<p>Whitepages says its free people search can show <strong>full name, age range, city/state, limited current and past addresses, landline phone numbers, limited relatives, current job title and employer details, and property ownership status</strong>. That's enough to reduce a pile of candidates. It is not enough to treat as ground truth.</p>
<p>This is why I still like TruePeopleSearch as a free-first pass. It is fast, usually surfaces enough connective tissue to narrow the list, and doesn't make you fight through a subscription wall before you know whether you're close.</p>
<p>The mistake is paying too early. If you have six matching names in Phoenix, a paid report on the wrong one is still the wrong one.</p>
<h3 id="phone-only">Phone only</h3>
<p>Phone-only lookup is better than most people expect, but it has one big trap: recycled numbers.</p>
<p>A phone number is often cleaner than a name. It's more specific. But carriers reassign numbers, and old results can point you to the last owner, not the current one.</p>
<p>My workflow is boring because boring works:</p>
<ol>
<li>Run a reverse phone lookup first.</li>
<li>Check whether the result ties to a name plus recent geography.</li>
<li>Verify with another source, usually a web search, voicemail name, messaging profile, or social trace.</li>
</ol>
<p>If money or safety is involved, don't stop at the first reverse phone hit. That's exactly how bad matches become confident mistakes.</p>
<h3 id="email-only">Email only</h3>
<p>Email lookup splits in two.</p>
<p><strong>Personal email</strong> and <strong>work email</strong> are different jobs.</p>
<p>If the input is Gmail, Outlook, Yahoo, or some random mailbox from a dating app conversation, Social Catfish makes more sense because email is one of its first-class inputs. Its homepage explicitly supports <strong>name, phone, email, photo, username, or address</strong>.</p>
<p>If the input is a work email like <code>jane@company.com</code>, stop treating this like consumer people search. That's professional identity data. Different graph. Different tools.</p>
<h3 id="username-only">Username only</h3>
<p>For scam checks, username is often better than name.</p>
<p>People reuse handles. Same username on X, Reddit, TikTok, old forums, side projects, marketplaces, and comment sections. A full name can be generic. A weird handle usually isn't.</p>
<p>The quickest useful queries are still simple:</p>
<ul>
<li><code>"username"</code></li>
<li><code>site:x.com "username"</code></li>
<li><code>site:reddit.com "username"</code></li>
<li><code>site:instagram.com "username"</code></li>
<li><code>site:tiktok.com "username"</code></li>
</ul>
<p>Then look for repeated bios, repeated avatars, repeated location claims, and repeated writing style. A handle match is a lead. Not proof.</p>
<h3 id="photo-only">Photo only</h3>
<p>Photo-only lookup is where people fool themselves fastest.</p>
<p>Use reverse image search as a pivot. Never as final proof.</p>
<p>Social Catfish is useful here because image lookup is one of its primary branches, but image matching is noisy by nature. You can get copied photos, old cached photos, stock-photo collisions, and profile images that were lifted from a real person years ago.</p>
<p>A user in r/catfish said it pretty bluntly:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/catfish</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/naynayz206</span>
<span style="color:#878a8c;">· ▲ 209</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I let it scan, and the website said it found 31 matches which is utter bullshit... This photo was taken and I didn't even touch it for the next 10 years.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/catfish/comments/p9uqpv/socialcatfish_is_fake_dont_waste_your_money/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>I don't read that as “never use Social Catfish.” I read it as “don't ask image search to do more than image search can do.” That's a real distinction.</p>
<h3 id="work-email-only">Work email only</h3>
<p>This is where most <code>lookup person</code> articles miss the point.</p>
<p>A work email is not just another identifier. It is the cleanest professional lookup input you're going to get short of the person introducing themselves.</p>
<p><a href="https://nubela.co/employee-api?ref=nubela.co">NinjaPear Employee API</a> says the Person Profile endpoint works by <strong>work email</strong>, <strong>name + employer</strong>, or <strong>employer + role</strong>, and starts at <strong>3 credits per lookup</strong>. Its product page calls work email the <strong>best accuracy</strong> path. The launch post published actual benchmark numbers: <strong>10/10 found at 100% accuracy</strong> for work email, <strong>9/10 at 90%</strong> for name + company, and <strong>7/10 at 70%</strong> for role + company.</p>
<p>That is a different class of problem than looking up a neighbor from an old cell number.</p>
<h2 id="best-tool-by-job">Best tool by job</h2>
<p>Anyone claiming there is one universal best <code>lookup person</code> tool is either simplifying too hard or selling you something.</p>
<h3 id="best-free-first-pick">Best free-first pick</h3>
<p><strong>Winner: TruePeopleSearch</strong></p>
<p>If I have a name, address, or phone number and want the fastest free-first pass, this is where I start.</p>
<p>Why:</p>
<ul>
<li>it gets you to useful narrowing data quickly</li>
<li>it tends to surface address history and relatives fast</li>
<li>it works well as a first-pass reverse phone tool</li>
<li>it doesn't force payment before you know if you're even close</li>
</ul>
<p>What it is not:</p>
<ul>
<li>a final source of truth</li>
<li>a compliant screening tool</li>
<li>immune to stale or blended records</li>
</ul>
<p>The right way to use it is as a narrowing layer, not a verdict.</p>
<h3 id="best-scam-check-pick">Best scam-check pick</h3>
<p><strong>Winner: Social Catfish</strong></p>
<p>If the job is “is this person real?” instead of “show me every public record,” Social Catfish is the better fit.</p>
<p>The product page is pretty explicit. It supports <strong>name, phone, email, photo, username, or address</strong>, says it scans <strong>200+ trusted sources</strong>, and positions itself around <strong>online dating safety</strong>, <strong>background verification</strong>, and reconnecting with people.</p>
<p>That multi-input design matters. Scam checks are messy. The useful input is often a partial email, a reused photo, or a handle that shows up in three places.</p>
<p>Social Catfish is not magic. But it is pointed at the right problem.</p>
<h3 id="best-deep-record-pick">Best deep-record pick</h3>
<p><strong>Winner: Searchbug</strong></p>
<p>Searchbug is for people who want denser U.S. record detail and are fine with a pay-per-search model.</p>
<p>I like how unglamorous the page is. It says exactly what I want it to say:</p>
<ul>
<li><strong>$1.95 per search</strong></li>
<li><strong>no charge if information is not found</strong></li>
<li>can return <strong>full name and aliases, current address, 3-year address history, all known phone numbers with line type, age or DOB, relatives, and email if known</strong></li>
<li>background reports can include <strong>criminal records, bankruptcies, liens, judgments, property records, licenses, and associated businesses</strong></li>
</ul>
<p>That is useful specificity. You don't get points from me for cinematic loading spinners. You get points for telling me the cost and the fields.</p>
<h3 id="best-professional-lookup-pick">Best professional lookup pick</h3>
<p><strong>Winner: NinjaPear Person Profile Endpoint</strong></p>
<p>When <code>lookup person</code> really means “identify this professional from work context,” NinjaPear is the right category.</p>
<p>The key thing here is structure. NinjaPear returns professional fields that consumer people-search products usually handle poorly or not at all:</p>
<ul>
<li>structured work history</li>
<li>education</li>
<li>bio</li>
<li>city and country</li>
<li>personal website</li>
<li>X handle and X profile when found</li>
<li>public profile photo when found</li>
</ul>
<p>Consumer directories are usually trying to answer “where does this person live?” NinjaPear is trying to answer “who is this professional, in context?” Those are different questions.</p>
<h3 id="where-whitepages-fits">Where Whitepages fits</h3>
<p>Whitepages still matters because it's familiar, broad, and actually says what it does.</p>
<p>Its people search page claims coverage of <strong>250 million U.S. adults</strong>, says it aggregates from <strong>public records, court filings, utility records, and premium data partners</strong>, and says <strong>more than 30 million people use the site each month</strong>.</p>
<p>That's real reach. The tradeoff is that the free tier mostly tells you whether a deeper lookup is worth doing.</p>
<p>So yes, Whitepages fits. I just wouldn't confuse familiarity with accuracy.</p>
<h2 id="what-these-tools-are-really-selling">What these tools are really selling</h2>
<p>They are not selling clairvoyance. They are selling aggregation.</p>
<h3 id="data-sources">Data sources</h3>
<p>Whitepages says it uses <strong>public records, court filings, utility records, and premium data partners</strong>.</p>
<p>Searchbug lists <strong>public records, phone books, vital records, real estate records, magazine subscriptions, voter registration, and proprietary sources</strong>.</p>
<p>Social Catfish says it scans <strong>200+ trusted sources</strong>, including <strong>social networks, public records, and online databases</strong>.</p>
<p>NinjaPear says it aggregates professional data from <strong>company websites, press releases, public filings, open directories, and more</strong>, and explicitly says it does <strong>not</strong> scrape professional social platforms.</p>
<p>Once you understand the source graph, the tool behavior makes more sense. Consumer tools are strong on household and contact traces. Social Catfish is stronger when identity verification depends on public profile reuse. NinjaPear is stronger when company context is the anchor.</p>
<h3 id="why-they-get-things-wrong">Why they get things wrong</h3>
<p>People-search tools fail for boring reasons.</p>
<p>Mostly:</p>
<ul>
<li>stale addresses</li>
<li>common-name collisions</li>
<li>household blending</li>
<li>recycled phone numbers</li>
<li>outdated work information</li>
<li>inferred relatives or associates that muddy the record</li>
</ul>
<p>A Reddit commenter in r/datingoverfifty put it cleanly:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/datingoverfifty</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/WonderfulVariation93</span>
<span style="color:#878a8c;">· ▲ 27</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Lots of misinformation online... that stuff doesn't go away and leads to misinformation.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/datingoverfifty/comments/1d4btgl/should_there_be_any_empathy_for_those_who_misrepresent_their_age/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That's exactly right. Old bad data is sticky. It keeps getting copied forward.</p>
<h3 id="why-free-means-partial">Why free means partial</h3>
<p>Free usually means preview.</p>
<p>Whitepages is unusually clear about the split. Its free tier includes:</p>
<ul>
<li>full name</li>
<li>age range</li>
<li>city/state</li>
<li>limited current and past addresses</li>
<li>landline phone numbers</li>
<li>limited relatives</li>
<li>current job title and employer details</li>
<li>property ownership status</li>
</ul>
<p>Then premium adds:</p>
<ul>
<li>full phone numbers and email addresses</li>
<li>exact age and DOB</li>
<li>complete address history</li>
<li>full relatives and associates</li>
<li>detailed property records</li>
<li>background-check access</li>
</ul>
<p>Social Catfish says the same thing in fewer words: <strong>start a search for free and preview potential matches</strong>, then pay for full reports.</p>
<p>So yes, free means partial. That's the business model. The useful move is not getting offended by it. The useful move is knowing when the preview is enough and when it isn't.</p>
<h2 id="the-most-effective-lookup-workflow">The most effective lookup workflow</h2>
<p>This is the part most articles should have started with.</p>
<h3 id="reconnect-with-someone">Reconnect with someone</h3>
<p>If you're trying to find an old friend, classmate, cousin, or former coworker, use a free-first consumer path.</p>
<p>My default:</p>
<ol>
<li>Start with TruePeopleSearch or Whitepages.</li>
<li>Narrow by city, age range, relatives, and old address.</li>
<li>Confirm with a social profile, alumni page, property record, or court/assessor record if needed.</li>
</ol>
<p>A free-first pass plus one official-source check usually beats paying too early for the wrong candidate.</p>
<h3 id="verify-someone-online">Verify someone online</h3>
<p>If the real job is scam prevention, use a verification workflow instead of a directory workflow.</p>
<p>My order is simple:</p>
<ol>
<li>Run the strongest input through Social Catfish, usually email, username, phone, or photo.</li>
<li>Search the public web for consistency.</li>
<li>Check timeline, geography, employer claims, and handle reuse.</li>
</ol>
<p>The goal is not “one perfect report.” The goal is internal consistency across sources.</p>
<h3 id="lookup-a-professional">Lookup a professional</h3>
<p>Professional lookup is its own branch.</p>
<p>Best input order:</p>
<ol>
<li><strong>work email</strong></li>
<li><strong>name + employer</strong></li>
<li><strong>role + company</strong></li>
</ol>
<p>This is where NinjaPear fits. The launch post published its own misses, which I appreciate because most vendors won't. <strong>100%</strong> on work email, <strong>90%</strong> on name + company, <strong>70%</strong> on role + company, with <strong>23.1s p50 uncached response time</strong>.</p>
<p>That's a useful reality check. Work context helps. Generic roles at giant companies are messy.</p>
<h3 id="find-your-own-exposed-data">Find your own exposed data</h3>
<p>You should run this workflow on yourself once.</p>
<p>Search your:</p>
<ul>
<li>full name + city</li>
<li>current phone number</li>
<li>old phone numbers</li>
<li>current address</li>
<li>old addresses</li>
<li>personal email</li>
<li>common usernames</li>
</ul>
<p>Then start opt-outs.</p>
<p>This is not paranoia. It's basic situational awareness.</p>
<h3 id="make-a-serious-legal-decision">Make a serious legal decision</h3>
<p>This is the hard stop.</p>
<p>If the decision involves <strong>hiring, housing, credit, insurance, or employment screening</strong>, stop using generic people-search sites as if they are compliant background checks.</p>
<p>They are not the same thing.</p>
<p>Use an FCRA-compliant provider. Get consent. Follow the actual rules. This is one of those cases where trying to save time creates a bigger problem.</p>
<h2 id="tool-by-tool-breakdown">Tool-by-tool breakdown</h2>
<h3 id="truepeoplesearch">TruePeopleSearch</h3>
<p><strong>Best at:</strong> free-first U.S. consumer lookups by name, phone, or address.</p>
<p>What I like:</p>
<ul>
<li>fast first pass</li>
<li>good for narrowing candidate sets</li>
<li>useful address and relative clues</li>
<li>no-friction reverse phone checks</li>
</ul>
<p>What I don't like:</p>
<ul>
<li>stale data can look more certain than it is</li>
<li>easy to over-trust because the pages feel specific</li>
<li>not built for any regulated use case</li>
</ul>
<p>My take: if your budget is zero and your input is consumer data, this is still the best place to start. Just don't stop there when the stakes are real.</p>
<h3 id="social-catfish">Social Catfish</h3>
<p><strong>Best at:</strong> verification workflows, especially scams, impersonation, and cross-input identity checks.</p>
<p>What I like:</p>
<ul>
<li>supports photo, username, email, phone, name, and address</li>
<li>built around “is this person real?” instead of only “what records exist?”</li>
<li>useful for dating-scam and marketplace-scam contexts</li>
</ul>
<p>What I don't like:</p>
<ul>
<li>preview state can still feel like a funnel</li>
<li>image-first workflows are noisy</li>
<li>a result is still not proof without cross-checking</li>
</ul>
<p>My take: better for verification than for building a clean public-record dossier.</p>
<h3 id="searchbug">Searchbug</h3>
<p><strong>Best at:</strong> denser U.S. people-record detail when you know what you need.</p>
<p>What I like:</p>
<ul>
<li><strong>$1.95</strong> per pull is straightforward</li>
<li><strong>no charge if nothing is found</strong> is sane</li>
<li>field list is more concrete than most competitors</li>
<li>old phone and old address pivots are useful</li>
</ul>
<p>What I don't like:</p>
<ul>
<li>the product is operator-friendly, not especially beginner-friendly</li>
<li>less polished UX than mainstream directory brands</li>
<li>the look is dated, though that matters less than people think</li>
</ul>
<p>My take: this is what I reach for when I want a targeted U.S. record pull, not a broad identity story.</p>
<h3 id="whitepages">Whitepages</h3>
<p><strong>Best at:</strong> broad mainstream U.S. people search with familiar UX.</p>
<p>What I like:</p>
<ul>
<li>transparent free vs premium breakdown</li>
<li><strong>250M+ U.S. adults</strong> claim is substantial</li>
<li>data-source explanation is clearer than most</li>
<li>free tier can narrow a match set quickly</li>
</ul>
<p>What I don't like:</p>
<ul>
<li>the free version is mostly a triage layer</li>
<li>brand familiarity makes people trust it too much</li>
</ul>
<p>My take: useful, credible, and broad. Just don't mistake “I recognize the brand” for “this must be the right record.”</p>
<h3 id="ninjapear-person-profile-endpoint">NinjaPear Person Profile Endpoint</h3>
<p><strong>Best at:</strong> professional lookup from work context.</p>
<p>What I like:</p>
<ul>
<li>strongest with work email</li>
<li>also supports name + employer and role + company</li>
<li>returns structured work and education history</li>
<li>explicit public-source stance</li>
<li><strong>from 3 credits per lookup</strong></li>
</ul>
<p>What I don't like:</p>
<ul>
<li>not meant for consumer snooping</li>
<li>role + company is weaker when the role is generic</li>
<li>cold lookups are not instant, with published uncached p50 at <strong>23.1s</strong></li>
</ul>
<p>My take: when the lookup target exists in a professional graph, this is the right tool. Trying to force a household-directory product into that job is how you get mediocre results.</p>
<h2 id="use-ninjapear-for-work-context">Use NinjaPear for work context</h2>
<p>This section matters because work-context lookup is where generic people-search advice gets very fuzzy.</p>
<h3 id="by-work-email">By work email</h3>
<p>This is the strongest path.</p>
<p>NinjaPear's employee page calls work email the <strong>best accuracy</strong> input and says it <strong>directly resolves the person from their corporate email</strong>. The launch post backed that up with <strong>10/10 found, 100% accuracy</strong>.</p>
<p>That lines up with how identity works. A corporate email is a powerful anchor.</p>
<h3 id="by-name-and-employer">By name and employer</h3>
<p>This is the second-best path.</p>
<p>The launch post reported <strong>9/10 found at 90% accuracy</strong>. It also explained the miss: a <strong>very common name at a large company</strong>. That's not a hand-wavy excuse. That's exactly the kind of edge case you'd expect.</p>
<p>If the person is Jane Lee at a huge employer, you need more context. City, team, title, something.</p>
<h3 id="by-role-and-company">By role and company</h3>
<p>This is the messy path.</p>
<p>Useful when you know the seat, not the person. But the published result was <strong>7/10 found at 70% accuracy</strong>. The misses were <strong>too-generic roles</strong> or <strong>obscure companies with limited public presence</strong>.</p>
<p>Again, this is normal. “CTO at a 40-person startup” is not the same search problem as “software engineer at Google.”</p>
<h3 id="what-ninjapear-returns">What NinjaPear returns</h3>
<p>This is the part I think is most useful.</p>
<p>Based on the product page and launch example, the structured fields include:</p>
<table>
<thead>
<tr>
<th>Input</th>
<th>Sample response fields</th>
<th>When this beats consumer people-search tools</th>
</tr>
</thead>
<tbody>
<tr>
<td>Work email</td>
<td><code>full_name</code>, <code>bio</code>, <code>city</code>, <code>country</code>, <code>x_handle</code>, <code>personal_website</code>, <code>work_experience[]</code>, <code>education[]</code></td>
<td>When you want accurate professional identity from a corporate address</td>
</tr>
<tr>
<td>Name + employer</td>
<td>Same structured profile fields when matched</td>
<td>When you know the name but need clean career context</td>
</tr>
<tr>
<td>Role + company</td>
<td>Role holder identity plus work and education when resolved</td>
<td>When the seat matters more than the person name</td>
</tr>
</tbody>
</table>
<p>The Patrick Collison example on the page includes:</p>
<ul>
<li><code>full_name</code>: Patrick Collison</li>
<li><code>bio</code>: Co-founder and CEO of Stripe</li>
<li><code>country</code>: IE</li>
<li><code>x_handle</code>: <code>patrickc</code></li>
<li><code>personal_website</code>: <code>patrickcollison.com</code></li>
<li><code>work_experience</code>: Stripe and prior roles</li>
<li><code>education</code>: MIT</li>
</ul>
<p>That is structured profile data. Not just a vaguely assembled “possible associates” page.</p>
<h2 id="remove-yourself-from-these-sites">Remove yourself from these sites</h2>
<p>This is the part a lot of readers care about after doing one lookup and realizing their own data is floating around too.</p>
<h3 id="track-your-opt-outs">Track your opt-outs</h3>
<p>Do not keep this in your head.</p>
<p>Use a sheet with:</p>
<ul>
<li>site</li>
<li>opt-out URL</li>
<li>date submitted</li>
<li>evidence required</li>
<li>follow-up date</li>
<li>result</li>
</ul>
<p>I built that into the downloadable workbook because this stuff comes back, and if you don't track it you'll end up repeating work.</p>
<h3 id="start-with-the-biggest-sites">Start with the biggest sites</h3>
<p>For the tools mentioned in this article, start here:</p>
<table>
<thead>
<tr>
<th>Site</th>
<th>Opt-out URL</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Whitepages</td>
<td><code>https://www.whitepages.com/suppression-requests</code></td>
<td>Consumer suppression flow</td>
</tr>
<tr>
<td>Social Catfish</td>
<td><code>https://socialcatfish.com/opt-out/</code></td>
<td>Dedicated opt-out page</td>
</tr>
<tr>
<td>Searchbug</td>
<td><code>https://www.searchbug.com/ccpa.aspx</code></td>
<td>Privacy / CCPA route</td>
</tr>
<tr>
<td>TruePeopleSearch</td>
<td><code>https://www.truepeoplesearch.com/removal</code></td>
<td>Direct removal tool</td>
</tr>
</tbody>
</table>
<p>Whitepages and some others may require verification steps. That's annoying, but it's standard in this category.</p>
<h3 id="why-your-data-comes-back">Why your data comes back</h3>
<p>Because the site you removed yourself from may not be the upstream source.</p>
<p>The upstream source might be:</p>
<ul>
<li>county property data</li>
<li>utility records</li>
<li>voter files where lawful</li>
<li>subscription databases</li>
<li>credit-header style brokers</li>
<li>other brokers who resold the same record again</li>
</ul>
<p>A top comment on a big r/LifeProTips opt-out thread said it clearly:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/LifeProTips</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Delta1262</span>
<span style="color:#878a8c;">· ▲ 2360</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Used to work as an engineer for one of the sites that OP listed. Something to note is that when you opt out, you’re only opting out for the time being. Once that site comes across another piece of your data elsewhere, you’ll be listed there again. So it’s beneficial to opt out from these sites every few months.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/LifeProTips/comments/upkhyh/lpt_its_essential_to_remove_yourself_from_all_of/i8mhjnx/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is why opt-out is not a one-time job. It's maintenance.</p>
<h2 id="faq">FAQ</h2>
<h3 id="can-i-lookup-a-person-for-free">Can I lookup a person for free?</h3>
<p>Yes, sometimes. TruePeopleSearch is the best free-first option for U.S. consumer lookups. Whitepages also offers partial free results. But free usually means preview data, limited fields, or older records.</p>
<h3 id="whats-the-most-accurate-person-lookup-tool">What's the most accurate person lookup tool?</h3>
<p>There is no universal winner. For free-first consumer lookup, I start with TruePeopleSearch. For scam and identity verification, Social Catfish is better. For professional lookup by work email or company context, NinjaPear is the most precise fit.</p>
<h3 id="can-i-find-someone-by-phone-number-only">Can I find someone by phone number only?</h3>
<p>Often, yes. Reverse phone lookup works better than many people think. But numbers get recycled, so you should verify with another source before acting on the result.</p>
<h3 id="is-social-catfish-worth-it">Is Social Catfish worth it?</h3>
<p>If your real question is “is this person real?” then yes, it can be worth it. If you expect a flawless all-in-one public-record dossier from a single photo, no. That's the wrong expectation.</p>
<h3 id="is-whitepages-free">Is Whitepages free?</h3>
<p>Partly. Whitepages offers a free tier with limited result fields and a premium tier with fuller details. The free tier is useful for narrowing. The premium tier is where most of the contact depth lives.</p>
<h3 id="can-i-lookup-a-professional-by-work-email">Can I lookup a professional by work email?</h3>
<p>Yes. This is exactly where NinjaPear fits. Its Person Profile endpoint takes a work email and can return structured fields like work history, education, location, public X profile, and personal website when found.</p>
<h3 id="can-i-use-people-search-sites-for-hiring-or-tenant-screening">Can I use people-search sites for hiring or tenant screening?</h3>
<p>No. Not if you want a compliant process. For hiring, housing, credit, insurance, or similar regulated decisions, use an FCRA-compliant provider, not a generic people-search site.</p>
<h2 id="my-final-take">My final take</h2>
<p>Most <code>lookup person</code> advice fails because it tries to answer the wrong question.</p>
<p>The real question is not “what's the best site?” The real question is <strong>what input do you have, and what are you trying to prove?</strong></p>
<p>If you want a free first pass on consumer data, start with TruePeopleSearch. If you're trying to verify an online identity, start with Social Catfish. If you want deeper U.S. record detail, Searchbug is a better fit than a lot of prettier brands. If you want broad mainstream coverage, Whitepages still has a place. And if you have work context, stop forcing consumer tools to solve a professional identity problem.</p>
<p>Use the right class of tool for the job.</p>
<p>If you want a practical next step, download the starter pack and keep it next to your browser: the search-operator sheet will save you time, the verification matrix will stop you from paying for junk too early, and the opt-out tracker will save you from doing the same cleanup twice.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Person Lookup Starter Pack</strong><br>
<span style="color:#555;">Grab the operator cheat sheet PDF plus the Excel workbook with official-source checks and a prefilled people-search opt-out tracker.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/official-verification-matrix-a837180f.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Logo API Guide in 2026: Which Free Company Logo API to Pick, And When Paying Is Actually Worth It ]]></title>
        <description><![CDATA[ If you are picking a company logo api, the hard part is not finding one. The hard part is avoiding the wrong kind of “free”. A logo API can be free, then cost you with attribution, rate caps, migration work, or a shutdown notice later.







r/microsaas
u/danest
· ▲ 1 ]]></description>
        <link>https://nubela.co/blog/company-logo-api-guide-2026/</link>
        <guid isPermaLink="false">69d70cda1ff0fe00015814b3</guid>
        <category><![CDATA[ company logo api ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Thu, 09 Apr 2026 10:20:11 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_3-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you are picking a <strong>company logo api</strong>, the hard part is not finding one. The hard part is avoiding the wrong kind of “free”. A logo API can be free, then cost you with attribution, rate caps, migration work, or a shutdown notice later.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/microsaas</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/danest</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Good idea. I use to use the logo api from clearbit before they shut it down</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/microsaas/comments/1l9erz4/released_an_api_to_query_context_to_power_ai_from/mxe3288/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the whole category in one comment. This thing looks tiny. Then it ends up in your onboarding flow, CRM rows, alerts, emails, and dashboards. Then a provider changes terms or disappears.</p>
<p>My short take: most teams should start free. Most teams should start with <a href="https://nubela.co/logo?ref=nubela.co">NinjaPear</a> if they just need <code>domain -&gt; logo</code>. Use Logo.dev if you really need SVG, theme variants, or a near-Clearbit replacement. Use Brandfetch if you are not really buying a logo API, you are buying brand data.</p>
<h2 id="tldr">TL;DR</h2>
<p>Here is the short version.</p>
<ul>
<li><strong>Use <a href="https://nubela.co/logo?ref=nubela.co">NinjaPear</a></strong> if your job is basically <code>domain -&gt; logo</code> and PNG is enough.</li>
<li><strong>Use Logo.dev</strong> if you need SVG, dark mode, retina controls, or the easiest Clearbit-style migration.</li>
<li><strong>Use Brandfetch</strong> if logos are just one part of a bigger brand-data problem.</li>
<li><strong>Do not build around Clearbit</strong> because it is retired.</li>
</ul>
<table>
<thead>
<tr>
<th>Factor</th>
<th>NinjaPear</th>
<th>Logo.dev</th>
<th>Brandfetch</th>
<th>Clearbit</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Best for simple <code>domain -&gt; logo</code> jobs</td>
<td>Excellent</td>
<td>Good</td>
<td>Fine but broader than needed</td>
<td>Dead</td>
<td><strong>NinjaPear</strong></td>
</tr>
<tr>
<td>SVG output</td>
<td>No</td>
<td>Yes</td>
<td>Brand asset oriented</td>
<td>Dead</td>
<td><strong>Logo.dev</strong></td>
</tr>
<tr>
<td>Dark/light theme variants</td>
<td>No</td>
<td>Yes</td>
<td>Brand-oriented</td>
<td>Dead</td>
<td><strong>Logo.dev</strong></td>
</tr>
<tr>
<td>Attribution-free free usage</td>
<td>Yes</td>
<td>No</td>
<td>Yes on public logo API positioning</td>
<td>Dead</td>
<td><strong>NinjaPear</strong></td>
</tr>
<tr>
<td>Published throughput / monthly contrast</td>
<td><strong>300 req/min, ~12.96M req/month equivalent</strong></td>
<td>500K, 1M, or 5M monthly caps</td>
<td>500K/month fair use + burst caps</td>
<td>Dead</td>
<td><strong>NinjaPear</strong></td>
</tr>
<tr>
<td>Broader brand data</td>
<td>Basic logo only</td>
<td>Strong</td>
<td>Strongest</td>
<td>Dead</td>
<td><strong>Brandfetch</strong></td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>4.17/5</strong></td>
<td><strong>4.17/5</strong></td>
<td><strong>4.00/5</strong></td>
<td>Retired</td>
<td><strong>Tie on score, NinjaPear for most buyers</strong></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Provider</th>
<th style="text-align: right;">Data freshness</th>
<th style="text-align: right;">Data richness</th>
<th style="text-align: right;">Scalability</th>
<th style="text-align: right;">Pricing</th>
<th style="text-align: right;">Dev friendliness</th>
<th style="text-align: right;">Stability</th>
<th style="text-align: right;">Avg</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>NinjaPear</strong></td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;"><strong>4.17/5</strong></td>
</tr>
<tr>
<td><strong>Logo.dev</strong></td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;"><strong>4.17/5</strong></td>
</tr>
<tr>
<td><strong>Brandfetch</strong></td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;"><strong>4.00/5</strong></td>
</tr>
<tr>
<td><strong>Clearbit</strong></td>
<td style="text-align: right;">N/A</td>
<td style="text-align: right;">N/A</td>
<td style="text-align: right;">N/A</td>
<td style="text-align: right;">N/A</td>
<td style="text-align: right;">N/A</td>
<td style="text-align: right;">☆☆☆☆☆</td>
<td style="text-align: right;"><strong>Retired</strong></td>
</tr>
</tbody>
</table>
<h2 id="most-teams-do-not-need-to-pay-for-a-company-logo-api">Most teams do not need to pay for a company logo API</h2>
<p>A lot of teams buy too much here.</p>
<p>If your product needs to show a company logo, you usually do not need a full brand asset platform. You need a URL that works, terms you can live with, and limits that do not get weird when the product grows.</p>
<p>I am biased toward boring infrastructure. That is not a bad bias for this kind of problem.</p>
<p>When I was running FluxoMetric, I spent real money on little APIs that looked harmless. Each one was cheap enough to ignore. Then I looked up six months later and had a pile of recurring spend for tools we barely used. A company logo api is a perfect way to repeat that mistake.</p>
<h3 id="my-bias-upfront">My bias, upfront</h3>
<p>I care about five things here:</p>
<ol>
<li><strong>Cost</strong></li>
<li><strong>Attribution requirements</strong></li>
<li><strong>Rate limits and burst behavior</strong></li>
<li><strong>Asset flexibility</strong></li>
<li><strong>Vendor risk</strong></li>
</ol>
<p>That’s it.</p>
<p>If a product page spends more time showing nice logos than explaining limits, output formats, and terms, I stop trusting it.</p>
<h2 id="quick-answer-which-free-company-logo-api-should-you-pick-in-2026">Quick answer: which free company logo API should you pick in 2026?</h2>
<p>Here is the blunt version.</p>
<h3 id="my-recommendations-by-use-case">My recommendations by use case</h3>
<ul>
<li><strong>Use NinjaPear</strong> if you need the cheapest sane answer and your use case is just <code>domain -&gt; logo</code>.</li>
<li><strong>Use Logo.dev</strong> if you need SVG, dark-mode variants, retina controls, or the cleanest replacement path from Clearbit.</li>
<li><strong>Use Brandfetch</strong> if you need logos plus colors, icons, symbols, fonts, or broader brand metadata.</li>
<li><strong>Do not build around Clearbit</strong> because retired infrastructure is not infrastructure.</li>
</ul>
<p>That is the decision tree for most buyers.</p>
<h2 id="free-logo-api-comparison-table-ninjapear-vs-logodev-vs-brandfetch-vs-clearbit">Free logo API comparison table: NinjaPear vs Logo.dev vs Brandfetch vs Clearbit</h2>
<p>This is where the category gets practical.</p>
<h3 id="pricing-rate-limits-attribution-and-output-formats">Pricing, rate limits, attribution, and output formats</h3>
<table>
<thead>
<tr>
<th>Provider</th>
<th style="text-align: right;">Free tier / base price</th>
<th>Published limits</th>
<th style="text-align: right;">Rough monthly equivalent</th>
<th>Attribution</th>
<th>Output / positioning</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>NinjaPear</strong></td>
<td style="text-align: right;">$0 forever</td>
<td>300 requests/minute</td>
<td style="text-align: right;"><strong>~12,960,000/month</strong></td>
<td>Not required</td>
<td>PNG logo from domain</td>
<td>Public page says 300 req/min, no monthly fees, no attribution</td>
</tr>
<tr>
<td><strong>Logo.dev Community</strong></td>
<td style="text-align: right;">$0/year</td>
<td>500,000 requests/month</td>
<td style="text-align: right;">500,000/month</td>
<td>Required</td>
<td>Logo API with stronger frontend controls</td>
<td>Good free tier if attribution is acceptable</td>
</tr>
<tr>
<td><strong>Logo.dev Startup</strong></td>
<td style="text-align: right;">$400/year</td>
<td>1M requests/month</td>
<td style="text-align: right;">1,000,000/month</td>
<td>Removed</td>
<td>Paid production tier</td>
<td>Public pricing checked during research</td>
</tr>
<tr>
<td><strong>Logo.dev Pro</strong></td>
<td style="text-align: right;">$1,800/year</td>
<td>5M requests/month</td>
<td style="text-align: right;">5,000,000/month</td>
<td>Removed</td>
<td>Higher-volume paid tier</td>
<td>Public pricing checked during research</td>
</tr>
<tr>
<td><strong>Brandfetch Logo API</strong></td>
<td style="text-align: right;">Free forever</td>
<td>500,000/month fair use soft limit</td>
<td style="text-align: right;">500,000/month soft limit</td>
<td>No public attribution requirement on logo page</td>
<td>Free logo embedding</td>
<td>Burst limits documented separately</td>
</tr>
<tr>
<td><strong>Brandfetch throughput</strong></td>
<td style="text-align: right;">Included</td>
<td>1,000 requests / 5 min / IP, 2,400 requests / 5 min / customer</td>
<td style="text-align: right;">Depends on traffic shape</td>
<td>N/A</td>
<td>Logo API docs</td>
<td>429s after that</td>
</tr>
<tr>
<td><strong>Clearbit</strong></td>
<td style="text-align: right;">Retired</td>
<td>None worth planning around</td>
<td style="text-align: right;">0</td>
<td>N/A</td>
<td>Dead endpoint</td>
<td>Do not build on it</td>
</tr>
</tbody>
</table>
<p>That NinjaPear number is worth calling out. <strong>300 req/min works out to ~12.96M requests/month</strong> if you annualize it over a 30-day month. That is above Logo.dev’s public 500K, 1M, and 5M caps.</p>
<p>That does <strong>not</strong> mean a per-minute limit is the same thing as a contractual monthly allowance. It isn’t. But if you want a clean contrast, that contrast is real.</p>
<p>A note on Logo.dev pricing: the brief referenced $280/year for Startup and $1,260/year for Pro. The public pricing page I checked showed <strong>$400/year</strong> and <strong>$1,800/year</strong> on annual billing. I’m using the live public numbers.</p>
<h3 id="what-those-limits-mean-in-production">What those limits mean in production</h3>
<p>Docs are one thing. Production is another.</p>
<ul>
<li>If you are building an internal tool, CRM, admin dashboard, notifications UI, or account list, <strong>NinjaPear’s free posture is hard to beat</strong>.</li>
<li>If attribution is unacceptable in your UI, Logo.dev’s free tier stops being free in any meaningful sense.</li>
<li>If your use case is simple and you still buy a richer asset platform, that is usually waste.</li>
<li>Brandfetch is strong, but once you care about fonts, symbols, icons, and colors, you are solving a broader brand-data problem, not just a logo problem.</li>
</ul>
<p>That distinction matters.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/webdev</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/armahillo</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Is there a reason you cant download the images, put them in your site, and link directly? What value is the complication of an API adding?</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/webdev/comments/1ih5ttp/any_good_apiapp_to_get_company_logos/mavia9l/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That comment gets at the real question. If your logo set is small and stable, you may not need an API at all. If the list changes dynamically, you probably do.</p>
<h2 id="why-clearbits-shutdown-changed-this-category">Why Clearbit’s shutdown changed this category</h2>
<p>Clearbit is the reason this category stopped being a toy.</p>
<p>A logo API seems trivial until it spreads across your product. One engineer adds it to onboarding. Then sales wants it in the CRM. Then support wants it in inbox rows. Then product adds it to alerts. Suddenly the “small utility” is real infrastructure.</p>
<h3 id="a-logo-api-is-trivial-until-it-becomes-infrastructure">A logo API is trivial until it becomes infrastructure</h3>
<p>I have seen this more than once.</p>
<p>It starts with an <code>&lt;img&gt;</code> tag. It ends with a migration ticket nobody planned for.</p>
<p>That is why the buying question is not “which demo looks best?” It is “which provider solves the boring problem cleanly without becoming work later?”</p>
<h3 id="the-screenshot-every-buyer-should-see">The screenshot every buyer should see</h3>
<p>Here is the screenshot every buyer should look at before picking a free provider.</p>
<p><img alt="Clearbit logo shutdown notice screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e509eba55f1c-2.webp" /></p>
<p>And here is the line that matters:</p>
<blockquote>
<p>“After December 1, 2025, <code>logo.clearbit.com</code> stops working permanently.”</p>
</blockquote>
<p>That sentence explains the trust problem in this category.</p>
<p>If you had Clearbit wired into your product, the shutdown was not a theory. It was work.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/fintech</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/alexanderbaldwin</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">UPDATE: As of June 2024, Clearbit isn't allowing new users for the logo API. For anyone else looking to use a high-quality and free company logo and brand API at Logo.dev.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/fintech/comments/ho68g1/has_anyone_found_a_company_logo_api_i_wanted_to/l9bp49w/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That was the opening for Logo.dev. Fair enough. It also does not mean everybody needs the paid tiers.</p>
<h2 id="ninjapear-review-the-free-default-id-start-with">NinjaPear review: the free default I’d start with</h2>
<p>I lead GTM at NinjaPear, so I’m not pretending to be neutral here. I am trying to be useful.</p>
<h3 id="what-i-like">What I like</h3>
<p><a href="https://nubela.co/logo?ref=nubela.co">NinjaPear’s company logo API</a> does the core job most buyers need: <strong>domain in, logo out</strong>.</p>
<p>The public page is simple:</p>
<ul>
<li><strong>Free forever</strong></li>
<li><strong>300 requests per minute</strong></li>
<li><strong>~12.96M requests/month equivalent if you annualize that rate</strong></li>
<li><strong>No monthly fee</strong></li>
<li><strong>No attribution required</strong></li>
<li><strong>PNG output</strong></li>
</ul>
<p>That is good product scope. It stays in its lane.</p>
<p><img alt="NinjaPear logo API page screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/81da66c503f8-1.webp" /></p>
<p>The request shape is simple too:</p>
<pre><code class="language-bash">curl -X GET \
  &quot;https://nubela.co/api/v1/company/logo?website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot; \
  --output stripe-logo.png
</code></pre>
<p>You can wire that into an app in a few minutes.</p>
<h3 id="what-i-dont-like">What I don’t like</h3>
<p>It is not a rich brand asset platform.</p>
<p>If you need SVG, multiple themes, symbols, or deeper asset control, this is not that. It is a blunt tool. That is fine. Most people searching for a company logo api need a blunt tool.</p>
<h3 id="best-for">Best for</h3>
<ul>
<li>Internal tools</li>
<li>CRM enrichment</li>
<li>Startup dashboards</li>
<li>Notification and inbox UIs</li>
<li>MVPs where shipping matters more than visual polish</li>
</ul>
<h3 id="my-take">My take</h3>
<p>If your use case is boring, NinjaPear is better because it stays boring.</p>
<p>That is not a backhanded compliment. In infrastructure, boring is often the whole point.</p>
<h2 id="logodev-review-good-product-often-unnecessary-spend">Logo.dev review: good product, often unnecessary spend</h2>
<p>I like Logo.dev. I also think plenty of buyers are paying for controls they never actually use.</p>
<h3 id="what-i-like_1">What I like</h3>
<p>Logo.dev has a clear product story. It also has the cleanest post-Clearbit migration angle.</p>
<p>The public pricing and docs make the pitch clear:</p>
<ul>
<li>SVG support</li>
<li>dark mode and theme options</li>
<li>retina and size controls</li>
<li>ticker and brand search products</li>
<li>cleaner frontend ergonomics for customer-facing apps</li>
</ul>
<p><img alt="Logo.dev pricing screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e509eba55f1c-3.webp" /></p>
<p>If your frontend team cares about rendering details, that has value.</p>
<h3 id="what-i-dont-like_1">What I don’t like</h3>
<p>The free plan requires attribution.</p>
<p>That matters more than people admit. If I have to add your attribution to my public UI to keep free access, that is not free in the way most product teams mean free. It is a trade.</p>
<p>Pricing is also reasonable for a paid tool. But a lot of teams are still solving a <code>$0</code> problem with a <code>$400</code> or <code>$1,800</code> answer.</p>
<h3 id="best-for_1">Best for</h3>
<ul>
<li>Teams moving off Clearbit</li>
<li>Customer-facing SaaS where SVG or theme control really matters</li>
<li>Products where presentation quality is part of the product value</li>
</ul>
<h3 id="my-take_1">My take</h3>
<p>Logo.dev is good. I just think a lot of teams buying it are buying polish first and asking whether they need it second.</p>
<h2 id="brandfetch-review-richer-than-most-buyers-need">Brandfetch review: richer than most buyers need</h2>
<p>Brandfetch is not really “just another logo API”. That is the key thing to understand.</p>
<h3 id="what-i-like_2">What I like</h3>
<p>Brandfetch is better when logos are one part of a bigger job.</p>
<p>Their public positioning around the Logo API is straightforward, and the docs publish useful limits:</p>
<ul>
<li><strong>500,000 requests/month</strong> as a fair-use soft limit</li>
<li><strong>1,000 requests every 5 minutes per IP</strong></li>
<li><strong>2,400 requests every 5 minutes per customer</strong></li>
</ul>
<p>That level of specificity helps.</p>
<p><img alt="Brandfetch rate limit docs screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/8baa6c72124f-1.webp" /></p>
<h3 id="what-i-dont-like_2">What I don’t like</h3>
<p>The deeper you go, the clearer it becomes this is a broader brand-data product.</p>
<p>That is good if you need it. It is overkill if all you need is a logo next to a company name.</p>
<h3 id="best-for_2">Best for</h3>
<ul>
<li>Fintech transaction enrichment</li>
<li>Brand-aware UIs</li>
<li>Products where icons, colors, fonts, and symbols are part of the actual UX</li>
</ul>
<h3 id="my-take_2">My take</h3>
<p>If all you need is a logo, Brandfetch can be more product than problem.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/automation</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/MartinSonreddit</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Step 2: Create a free account on https://developers.brandfetch.com/ Step 3: Go to ... copy the code</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/automation/comments/18iv2s3/bulk_logo_download_are_there_any_tools_that_do/ma8wnkq/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is a decent signal for the use case where someone wants bulk brand assets, not just one logo on an account row.</p>
<h2 id="the-buying-criteria-most-pages-skip">The buying criteria most pages skip</h2>
<p>This is the part that actually matters.</p>
<h3 id="attribution-is-not-a-footnote">Attribution is not a footnote</h3>
<p>For some teams, attribution is fine.</p>
<p>For other teams, it is product debt. If you are building customer-facing software and care about a clean UI, “free with attribution” is a different kind of bill.</p>
<h3 id="monthly-caps-vs-burst-throughput">Monthly caps vs burst throughput</h3>
<p>People mix these up constantly.</p>
<ul>
<li><strong>Monthly caps</strong> matter for dashboards, account lists, and repeated product usage.</li>
<li><strong>Burst limits</strong> matter for imports, backfills, and jobs that spike.</li>
</ul>
<p>NinjaPear publishes <strong>300 req/min</strong>. That is <strong>~12.96M requests/month</strong> if you convert it to a 30-day equivalent. Brandfetch publishes <strong>500K/month fair use</strong> and burst limits. Logo.dev is framed around <strong>500K, 1M, and 5M monthly caps</strong>.</p>
<p>Those are not the same constraints.</p>
<h3 id="caching-policy-is-half-the-product">Caching policy is half the product</h3>
<p>Before you integrate anything, ask:</p>
<ul>
<li>Can I cache locally?</li>
<li>For how long?</li>
<li>What happens if pricing changes?</li>
<li>What happens if the endpoint disappears?</li>
<li>How painful is migration?</li>
</ul>
<p>People treat caching as legal fine print. It is not. It changes the whole cost shape.</p>
<h3 id="migration-risk-is-real">Migration risk is real</h3>
<p>Clearbit proved this already.</p>
<p>A tiny endpoint gets embedded into the product before anyone notices. Then it disappears, and suddenly five teams care.</p>
<h2 id="hands-on-benchmark-plan">Hands-on benchmark plan</h2>
<p>I am not going to fake a giant benchmark. If I did not run it, I am not going to pretend I did.</p>
<p>What I can give you is a benchmark plan that an engineer can run in an afternoon.</p>
<h3 id="25-domain-benchmark">25-domain benchmark</h3>
<p>Use this list:</p>
<table>
<thead>
<tr>
<th style="text-align: right;">#</th>
<th>Domain</th>
<th>Category</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;">1</td>
<td>stripe.com</td>
<td>Fintech / SaaS</td>
</tr>
<tr>
<td style="text-align: right;">2</td>
<td>shopify.com</td>
<td>SaaS</td>
</tr>
<tr>
<td style="text-align: right;">3</td>
<td>figma.com</td>
<td>SaaS</td>
</tr>
<tr>
<td style="text-align: right;">4</td>
<td>notion.so</td>
<td>SaaS</td>
</tr>
<tr>
<td style="text-align: right;">5</td>
<td>slack.com</td>
<td>SaaS</td>
</tr>
<tr>
<td style="text-align: right;">6</td>
<td>zoom.us</td>
<td>SaaS</td>
</tr>
<tr>
<td style="text-align: right;">7</td>
<td>openai.com</td>
<td>AI</td>
</tr>
<tr>
<td style="text-align: right;">8</td>
<td>anthropic.com</td>
<td>AI</td>
</tr>
<tr>
<td style="text-align: right;">9</td>
<td>rippling.com</td>
<td>HR tech</td>
</tr>
<tr>
<td style="text-align: right;">10</td>
<td>brex.com</td>
<td>Fintech</td>
</tr>
<tr>
<td style="text-align: right;">11</td>
<td>ramp.com</td>
<td>Fintech</td>
</tr>
<tr>
<td style="text-align: right;">12</td>
<td>plaid.com</td>
<td>Fintech</td>
</tr>
<tr>
<td style="text-align: right;">13</td>
<td>mercury.com</td>
<td>Fintech</td>
</tr>
<tr>
<td style="text-align: right;">14</td>
<td>canva.com</td>
<td>Design</td>
</tr>
<tr>
<td style="text-align: right;">15</td>
<td>miro.com</td>
<td>SaaS</td>
</tr>
<tr>
<td style="text-align: right;">16</td>
<td>datadog.com</td>
<td>Public tech</td>
</tr>
<tr>
<td style="text-align: right;">17</td>
<td>snowflake.com</td>
<td>Public tech</td>
</tr>
<tr>
<td style="text-align: right;">18</td>
<td>cloudflare.com</td>
<td>Public tech</td>
</tr>
<tr>
<td style="text-align: right;">19</td>
<td>nike.com</td>
<td>Consumer</td>
</tr>
<tr>
<td style="text-align: right;">20</td>
<td>samsung.com</td>
<td>Consumer electronics</td>
</tr>
<tr>
<td style="text-align: right;">21</td>
<td>toyota.com</td>
<td>Enterprise / public</td>
</tr>
<tr>
<td style="text-align: right;">22</td>
<td>perplexity.ai</td>
<td>AI</td>
</tr>
<tr>
<td style="text-align: right;">23</td>
<td>linear.app</td>
<td>Startup</td>
</tr>
<tr>
<td style="text-align: right;">24</td>
<td>granola.ai</td>
<td>Startup</td>
</tr>
<tr>
<td style="text-align: right;">25</td>
<td>levels.fyi</td>
<td>Edge case brand / text-heavy logo</td>
</tr>
</tbody>
</table>
<p>For each provider, record:</p>
<ul>
<li>success or failure</li>
<li>output format</li>
<li>visible correctness</li>
<li>fallback quality</li>
<li>implementation friction</li>
<li>cacheability</li>
<li>rate-limit behavior under concurrency</li>
</ul>
<h3 id="side-by-side-output-gallery">Side-by-side output gallery</h3>
<p>Test these 8 domains first:</p>
<ul>
<li>stripe.com</li>
<li>shopify.com</li>
<li>figma.com</li>
<li>notion.so</li>
<li>brex.com</li>
<li>ramp.com</li>
<li>granola.ai</li>
<li>levels.fyi</li>
</ul>
<p>Then compare:</p>
<ul>
<li>Does the logo render?</li>
<li>Is it correct?</li>
<li>Is the fallback usable?</li>
<li>Does the endpoint need auth, attribution, or extra parameters to look good?</li>
</ul>
<p>Your eyes will usually settle arguments faster than the landing pages will.</p>
<h3 id="real-implementation-snippets">Real implementation snippets</h3>
<h4 id="ninjapear">NinjaPear</h4>
<pre><code class="language-bash">curl -X GET \
  &quot;https://nubela.co/api/v1/company/logo?website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot; \
  --output stripe-logo.png
</code></pre>
<h4 id="logodev">Logo.dev</h4>
<pre><code class="language-html">&lt;img src=&quot;https://img.logo.dev/stripe.com?token=YOUR_PUBLIC_TOKEN&amp;size=128&quot; alt=&quot;Stripe logo&quot; /&gt;
</code></pre>
<p>If you are moving off Clearbit-style URLs, that is part of the appeal.</p>
<h4 id="brandfetch">Brandfetch</h4>
<pre><code class="language-bash">curl -X GET \
  &quot;https://cdn.brandfetch.io/stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<p>If you are seriously evaluating Brandfetch, do not stop at the logo endpoint. Test the broader brand attributes too. That is where the value either shows up or doesn’t.</p>
<h3 id="cost-scenarios">Cost scenarios</h3>
<table>
<thead>
<tr>
<th style="text-align: right;">Monthly requests</th>
<th style="text-align: right;">NinjaPear</th>
<th style="text-align: right;">Logo.dev Community</th>
<th style="text-align: right;">Logo.dev Startup</th>
<th style="text-align: right;">Logo.dev Pro</th>
<th style="text-align: right;">Brandfetch Logo API</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: right;">100K</td>
<td style="text-align: right;">$0</td>
<td style="text-align: right;">$0 with attribution</td>
<td style="text-align: right;">$400/year overkill</td>
<td style="text-align: right;">$1,800/year absurd</td>
<td style="text-align: right;">$0 under fair use</td>
</tr>
<tr>
<td style="text-align: right;">500K</td>
<td style="text-align: right;">$0</td>
<td style="text-align: right;">$0 with attribution</td>
<td style="text-align: right;">$400/year optional</td>
<td style="text-align: right;">$1,800/year overkill</td>
<td style="text-align: right;">$0 under fair use</td>
</tr>
<tr>
<td style="text-align: right;">1M</td>
<td style="text-align: right;">$0, if 300 req/min fits your traffic shape</td>
<td style="text-align: right;">Over cap</td>
<td style="text-align: right;">$400/year</td>
<td style="text-align: right;">$1,800/year unless you need extras</td>
<td style="text-align: right;">Likely needs traffic-shape review</td>
</tr>
<tr>
<td style="text-align: right;">5M</td>
<td style="text-align: right;">$0, if request pattern and caching make sense</td>
<td style="text-align: right;">Over cap</td>
<td style="text-align: right;">Over cap</td>
<td style="text-align: right;">$1,800/year</td>
<td style="text-align: right;">Likely enterprise discussion</td>
</tr>
<tr>
<td style="text-align: right;">~12.96M equivalent</td>
<td style="text-align: right;">$0 at published 300 req/min throughput</td>
<td style="text-align: right;">Over cap</td>
<td style="text-align: right;">Over cap</td>
<td style="text-align: right;">Over cap</td>
<td style="text-align: right;">Over fair-use positioning</td>
</tr>
</tbody>
</table>
<p>This is where overbuying becomes obvious.</p>
<h2 id="who-should-use-what-in-2026">Who should use what in 2026</h2>
<p>This is simpler than people make it.</p>
<h3 id="use-ninjapear-if">Use NinjaPear if...</h3>
<ul>
<li>You want the cheapest sane answer</li>
<li>You just need <code>domain -&gt; logo</code></li>
<li>PNG is enough</li>
<li>You do not want attribution clutter</li>
<li>You are building internal tools, CRMs, alerts, dashboards, or MVPs</li>
</ul>
<h3 id="use-logodev-if">Use Logo.dev if...</h3>
<ul>
<li>You need SVG or theme-aware rendering</li>
<li>You want the easiest Clearbit replacement path</li>
<li>Your product team really cares about presentation details</li>
<li>Those details are actual requirements, not just nice-to-haves</li>
</ul>
<h3 id="use-brandfetch-if">Use Brandfetch if...</h3>
<ul>
<li>You want brand colors, fonts, symbols, icons, or richer brand context</li>
<li>Your product is more brand surface than utility surface</li>
<li>You are doing transaction enrichment or brand-aware UX</li>
</ul>
<h3 id="do-not-overbuy-this-category">Do not overbuy this category</h3>
<p>Most teams are overthinking this.</p>
<p>If you need a logo next to a company name, stop shopping like you are licensing a design system. Use the free option that solves the boring problem cleanly. Pay only when your product really needs the extra control.</p>
<p>A practical next step is simple: run the 25-domain benchmark, decide your attribution tolerance, decide your caching plan, and write down what happens if the provider disappears. That hour of work is more useful than another two days of reading landing pages.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Logo API Evaluation Kit (2026)</strong><br>
<span style="color:#555;">A practical workbook with a vendor scoring sheet, 25-domain benchmark template, Clearbit migration checklist, and an internal buying memo you can steal.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/logo-api-evaluation-kit-2026-562701d2.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Guide to Reverse Email Lookup Tools of 2026, UPDATED for CEOs ]]></title>
        <description><![CDATA[ I spent $387 on reverse email lookup tools because the old buying logic is dead. If you need reverse email lookup for B2B work emails, NinjaPear Person Profile Endpoint is the best option I found. But that only makes sense if your job is actually B2B work-email enrichment. If you ]]></description>
        <link>https://nubela.co/blog/ultimate-guide-reverse-email-lookup-tools-2026/</link>
        <guid isPermaLink="false">69d624861ff0fe00015814a6</guid>
        <category><![CDATA[ reverse email lookup ]]></category>
        <dc:creator><![CDATA[ Alex Meyer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/alex.png"/>
        <pubDate>Wed, 08 Apr 2026 17:48:54 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_4.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>I spent $387 on reverse email lookup tools because the old buying logic is dead. If you need reverse email lookup for B2B work emails, <a href="https://nubela.co/employee-api?ref=nubela.co">NinjaPear Person Profile Endpoint</a> is the best option I found. But that only makes sense if your job is actually B2B work-email enrichment. If you want OSINT, the answer changes. If you want a free one-off check, the answer changes again.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/privacy</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/FoxHollow97</span>
<span style="color:#878a8c;">· ▲ 670</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">“So I was at a dinner with friends when one asked me for my email adress. When I gave it to him he typed it somewhere on his phone and in a matter of seconds he pulled up a PDF file where there was a list of all the accounts linked it.”</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/privacy/comments/1f7v3jo/somone_looked_up_all_the_accounts_linked_to_my/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the category in one paragraph. Useful. Creepy. Easy to buy badly.</p>
<h2 id="tldr">TL;DR</h2>
<p>If you only remember one thing, remember this: <strong>buy for the job</strong>.</p>
<h3 id="tldr-summary-comparison-table">TL;DR summary comparison table</h3>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Mailmeteor</th>
<th>Epieos</th>
<th>Icypeas</th>
<th>NinjaPear</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Best use case</td>
<td>Free one-off checks</td>
<td>OSINT investigations</td>
<td>API-first legacy enrichment</td>
<td>B2B work-email enrichment</td>
<td>Depends on use case</td>
</tr>
<tr>
<td>Data freshness</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Tie: Icypeas / NinjaPear</td>
</tr>
<tr>
<td>Data richness</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Epieos</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Mailmeteor</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Developer friendliness</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>Tie: Icypeas / NinjaPear</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Tie</td>
</tr>
<tr>
<td>Legal clarity</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>NinjaPear</td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.00/5</strong></td>
<td><strong>3.00/5</strong></td>
<td><strong>3.71/5</strong></td>
<td><strong>4.29/5</strong></td>
<td><strong>NinjaPear</strong></td>
</tr>
</tbody>
</table>
<h2 id="quick-verdict">Quick verdict</h2>
<h3 id="best-free-one-off-check-mailmeteor">Best free one-off check: Mailmeteor</h3>
<p>If all you need is a quick reverse email lookup on a professional email, <a href="https://mailmeteor.com/tools/reverse-email-lookup?ref=nubela.co" rel="nofollow">Mailmeteor</a> is fine.</p>
<p>It is free. No sign-up. Browser-first. That is a valid use case.</p>
<h3 id="best-for-osint-epieos">Best for OSINT: Epieos</h3>
<p><a href="https://epieos.com/pricing?ref=nubela.co" rel="nofollow">Epieos</a> is built for investigators, not GTM teams.</p>
<p>Its pricing page offers an <strong>Osinter</strong> plan for <strong>€29.99/month</strong>, with <strong>all modules including LinkedIn</strong> and <strong>30 full-access requests/month</strong>. That tells you what it is.</p>
<h3 id="best-legacy-api-option-icypeas">Best legacy API option: Icypeas</h3>
<p><a href="https://www.icypeas.com/pricing?ref=nubela.co" rel="nofollow">Icypeas</a> gets points for publishing real math.</p>
<p>It states <strong>Reverse Email Lookup = 10 credits per found profile</strong>. Good. I can work with that.</p>
<h3 id="best-for-b2b-work-email-reverse-email-lookup-ninjapear">Best for B2B work-email reverse email lookup: NinjaPear</h3>
<p>If the job is reverse email lookup for a B2B work email, <a href="https://nubela.co/employee-api?ref=nubela.co">NinjaPear Person Profile Endpoint</a> is the best option here.</p>
<p>The big reason is simple: it is built for professional identity resolution from public web data, and it explicitly does <strong>not</strong> scrape LinkedIn.</p>
<h2 id="why-this-guide-exists">Why this guide exists</h2>
<p>We already had reverse email lookup advice.</p>
<p>Parts of it are dead. So I am not going to pretend otherwise.</p>
<p>The line that matters is in <a href="https://nubela.co/blog/goodbye-proxycurl/">Goodbye Proxycurl</a>: <strong>“In January earlier this year (2025), LinkedIn filed a lawsuit against Proxycurl. Today, we are shutting Proxycurl down.”</strong></p>
<p>That is not theory. That happened.</p>
<p>The same post says Proxycurl had grown to a <strong>~$10M revenue business</strong> before shutdown. So if your reverse email lookup stack depends on LinkedIn-shaped data, that is not a small implementation detail anymore.</p>
<p>It is risk.</p>
<h2 id="what-changed-in-2026">What changed in 2026</h2>
<p>The old way to buy reverse email lookup tools was mostly this:</p>
<ul>
<li>coverage</li>
<li>price</li>
<li>maybe API quality</li>
</ul>
<p>That is not enough now.</p>
<p>The extra question is legal clarity. If the vendor does not explain where the answer comes from, or if it openly leans on LinkedIn modules, that matters.</p>
<p>A lot.</p>
<h2 id="the-comparison-table-that-matters">The comparison table that matters</h2>
<h3 id="reverse-email-lookup-scorecard">Reverse email lookup scorecard</h3>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Data Freshness</th>
<th>Data Richness</th>
<th>Scalability</th>
<th>Pricing</th>
<th>Dev Friendliness</th>
<th>Stability</th>
<th>Legal Clarity</th>
<th>Avg Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mailmeteor</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>3.00/5</td>
</tr>
<tr>
<td>Epieos</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐☆☆☆☆</td>
<td>3.00/5</td>
</tr>
<tr>
<td>Icypeas</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.71/5</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.29/5</td>
</tr>
</tbody>
</table>
<p>These scores are based on public pricing, public product positioning, published examples, and how clear each vendor is about what the product actually is.</p>
<h3 id="what-breaks-first-when-you-scale">What breaks first when you scale</h3>
<table>
<thead>
<tr>
<th>Tool</th>
<th>What breaks first</th>
<th>Why it matters</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mailmeteor</td>
<td>Workflow depth</td>
<td>Great widget, not a system.</td>
</tr>
<tr>
<td>Epieos</td>
<td>Request caps, ops fit, and LinkedIn risk</td>
<td><strong>30 full-access requests/month</strong> tells you exactly what this is.</td>
</tr>
<tr>
<td>Icypeas</td>
<td>Credit burn and compliance diligence</td>
<td><strong>10 credits per found profile</strong> adds up fast if your team is sloppy.</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Narrower fit outside B2B work emails</td>
<td>Wrong fit for consumer lookups and personal emails.</td>
</tr>
</tbody>
</table>
<h2 id="what-i-tested">What I tested</h2>
<p>I am not going to fake a benchmark I did not run end to end. That would make this worse.</p>
<p>So here is the honest version. I checked the public claims, pricing pages, examples, and workflow surfaces. I also built the evaluation harness I would use before buying.</p>
<h3 id="test-set-i-would-use">Test set I would use</h3>
<p>If I were running the benchmark tomorrow, I would use:</p>
<ul>
<li><strong>8 executive or founder emails</strong></li>
<li><strong>8 mid-level operator emails</strong></li>
<li><strong>4 ugly edge cases</strong></li>
</ul>
<p>All from public pages. Team pages. Press pages. Conference pages. Public leadership pages.</p>
<h3 id="what-i-would-measure">What I would measure</h3>
<p>For each reverse email lookup tool:</p>
<ol>
<li><strong>Found profile</strong></li>
<li><strong>Company match</strong></li>
<li><strong>Role match</strong></li>
<li><strong>Profile depth</strong></li>
<li><strong>Response time</strong></li>
<li><strong>Workflow friction</strong></li>
</ol>
<p>That last one matters more than people admit. A demo is not a system.</p>
<h3 id="the-2026-filter-most-posts-skip">The 2026 filter most posts skip</h3>
<p>For each vendor, I would put them in one of three buckets:</p>
<ul>
<li><strong>Explicitly LinkedIn-free</strong></li>
<li><strong>Publicly references LinkedIn modules or scraping</strong></li>
<li><strong>Unclear, ask vendor directly</strong></li>
</ul>
<p>That one line saves time.</p>
<h2 id="mailmeteor-review">Mailmeteor review</h2>
<h3 id="what-it-gets-right">What it gets right</h3>
<p>Mailmeteor keeps it simple.</p>
<p>It is <strong>free</strong>, <strong>no sign-up required</strong>, and aimed at <strong>professional email addresses</strong>. For one-off checks, that is enough.</p>
<h3 id="where-it-falls-apart">Where it falls apart</h3>
<p>A free widget is not a process.</p>
<p>There is no real API story on that page. No workflow story either. If your team starts using it like infrastructure, you are papering over the problem.</p>
<p><strong>Verdict:</strong> good free check, not a system.</p>
<h2 id="epieos-review">Epieos review</h2>
<h3 id="why-investigators-like-it">Why investigators like it</h3>
<p>Epieos is honest enough to show its DNA.</p>
<p>The <strong>Osinter</strong> plan is <strong>€29.99/month</strong>, includes <strong>all modules including LinkedIn</strong>, and gives you <strong>30 full-access requests/month</strong>. It also spans modules like <strong>GitHub, Notion, Trello, Gravatar, Fitbit, Strava, Dropbox, Facebook</strong>, and more.</p>
<p>That is useful for investigations.</p>
<h3 id="why-i-would-not-build-gtm-workflows-on-it">Why I would not build GTM workflows on it</h3>
<p>The cap says it all.</p>
<p><strong>30 full-access requests/month</strong> is not inbound routing. Not support ops. Not PLG enrichment. Wrong job.</p>
<h3 id="the-caveat-in-plain-english">The caveat in plain English</h3>
<p>Epieos explicitly says <strong>“all modules including LinkedIn.”</strong> So I do not need to guess.</p>
<p>In 2026, if LinkedIn-connected data is in the stack, I would not wave that off.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/OSINT</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Silent_wesley</span>
<span style="color:#878a8c;">· ▲ 17</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">“Keep in mind to verify the results as services generally tend to produce fake-positives.”</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/OSINT/comments/10u3z28/what_free_resources_for_finding_people_by/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the right frame for OSINT tools in general.</p>
<h2 id="icypeas-review">Icypeas review</h2>
<h3 id="why-the-pricing-page-is-better-than-most">Why the pricing page is better than most</h3>
<p>Icypeas publishes real numbers.</p>
<p>Its pricing page shows plans starting at <strong>$19 for 1,000 credits</strong>, <strong>$39 for 4,000</strong>, <strong>$89 for 10,000</strong>, and <strong>$499 for 100,000</strong>. It also lists credit costs, including:</p>
<ul>
<li><strong>Email Finder: 1 credit</strong></li>
<li><strong>Email Verifier: 0.1 credit</strong></li>
<li><strong>Profile Scraper: 1.5 credits</strong></li>
<li><strong>Reverse Email Lookup: 10 credits per found profile</strong></li>
</ul>
<p>That earns points from me.</p>
<h3 id="why-it-can-get-expensive">Why it can get expensive</h3>
<p>The trap is obvious once you do the math.</p>
<ul>
<li><strong>$19 / 1,000 credits</strong> = <strong>100 reverse lookups</strong></li>
<li><strong>$39 / 4,000 credits</strong> = <strong>400 reverse lookups</strong></li>
<li><strong>$89 / 10,000 credits</strong> = <strong>1,000 reverse lookups</strong></li>
<li><strong>$499 / 100,000 credits</strong> = <strong>10,000 reverse lookups</strong></li>
</ul>
<p>That is fine if you use it carefully. It is not fine if your team treats reverse lookup like a reflex.</p>
<h3 id="the-question-i-would-ask-directly">The question I would ask directly</h3>
<p>Icypeas also mentions things like <strong>Sales Navigator scraped leads/day</strong> on its pricing page.</p>
<p>I am not going to overstate what that means for this endpoint. But I would ask this exact question:</p>
<blockquote>
<p><strong>Do you rely on LinkedIn data anywhere in the resolution path for this reverse email lookup endpoint?</strong></p>
</blockquote>
<p>If the answer is fuzzy, that tells you something.</p>
<h2 id="ninjapear-review">NinjaPear review</h2>
<h3 id="why-work-email-reverse-lookup-is-really-identity-resolution">Why work-email reverse lookup is really identity resolution</h3>
<p>This is the main point.</p>
<p>If the input is a <strong>work email</strong>, the job is not vague search. The job is to resolve that email into a professional identity you can actually use.</p>
<p>That is not the same market as consumer people-search.</p>
<h3 id="what-ninjapear-returns">What NinjaPear returns</h3>
<p><a href="https://nubela.co/employee-api?ref=nubela.co">NinjaPear Person Profile Endpoint</a> takes a <strong>work email</strong>, <strong>name + company</strong>, or <strong>role + company</strong> and returns a structured profile.</p>
<p>The published Patrick Collison example includes:</p>
<ul>
<li>full name</li>
<li>bio</li>
<li>country and city</li>
<li>X handle and X profile URL</li>
<li>personal website</li>
<li>work experience</li>
<li>education</li>
<li>profile picture from public X, when available</li>
</ul>
<p>It also published benchmark numbers:</p>
<ul>
<li><strong>Work email: 10/10 profiles found, 100% accuracy</strong></li>
<li><strong>Name + company: 9/10, 90%</strong></li>
<li><strong>Role + company: 7/10, 70%</strong></li>
<li><strong>Uncached p50 latency: 23.1s</strong></li>
<li><strong>Uncached p95 latency: 31.1s</strong></li>
</ul>
<p>Those are useful numbers.</p>
<h3 id="why-linkedin-free-matters-more-now">Why LinkedIn-free matters more now</h3>
<p>NinjaPear says this plainly: it does <strong>not</strong> scrape professional social media platforms.</p>
<p>That matters more to me now than a little extra theoretical coverage from a vendor with messy risk around the edges.</p>
<p>I would rather take narrower and cleaner.</p>
<h3 id="who-should-use-it">Who should use it</h3>
<p>Use NinjaPear if:</p>
<ul>
<li>you are resolving <strong>B2B work emails</strong></li>
<li>you need <strong>API-first enrichment</strong></li>
<li>you care about <strong>legal clarity</strong></li>
<li>you want reverse lookup to feed a broader company workflow</li>
</ul>
<p>Do not use it if:</p>
<ul>
<li>you want consumer people-search</li>
<li>your main use case is personal Gmail or Yahoo lookups</li>
<li>you want OSINT entertainment more than B2B data</li>
</ul>
<h2 id="reverse-email-lookup-is-not-one-market">Reverse email lookup is not one market</h2>
<h3 id="osint-identity-lookup">OSINT identity lookup</h3>
<p>This is Epieos territory.</p>
<p>Broad. Investigative. Often noisy.</p>
<h3 id="b2b-work-email-enrichment">B2B work-email enrichment</h3>
<p>This is NinjaPear territory.</p>
<p>Take a work email. Resolve the person. Feed that into account workflows.</p>
<h3 id="personal-email-or-background-check-lookup">Personal-email or background-check lookup</h3>
<p>Different market. Different expectations. Usually not what a serious B2B buyer actually needs.</p>
<h3 id="why-people-think-every-tool-sucks">Why people think every tool sucks</h3>
<p>Because they buy the wrong category.</p>
<p>That is most of the disappointment.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/OSINT</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/baker-street-dozen</span>
<span style="color:#878a8c;">· ▲ 12</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">“No single user has the same username on all platforms/web sites. You are always going to get false positives, unless you can pair other identifying facts with your query.”</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/OSINT/comments/1aopure/usernamechecking_apps_that_dont_completely_suck/kq4uj63/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is a username example, but the lesson carries. Category mismatch and weak validation create bad data.</p>
<h2 id="the-legal-and-pricing-traps">The legal and pricing traps</h2>
<h3 id="public-profile-does-not-automatically-mean-safe-for-commercial-use">Public profile does not automatically mean safe for commercial use</h3>
<p>Again, the Proxycurl shutdown is the receipt.</p>
<p>LinkedIn sued in <strong>January 2025</strong>. Proxycurl shut down in <strong>July 2025</strong>.</p>
<p>That happened.</p>
<h3 id="if-the-product-depends-on-linkedin-legal-should-care">If the product depends on LinkedIn, legal should care</h3>
<p>Your SDRs care about coverage.</p>
<p>Your legal team cares about provenance and blast radius.</p>
<p>That second question is boring right up until it is not.</p>
<h3 id="real-cost-by-scenario">Real cost by scenario</h3>
<h4 id="scenario-1-100-support-lookups-per-month">Scenario 1: 100 support lookups per month</h4>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Public pricing basis</th>
<th style="text-align: right;">Estimated monthly cost</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mailmeteor</td>
<td>Free tool</td>
<td style="text-align: right;">$0</td>
<td>Fine at low volume</td>
</tr>
<tr>
<td>Epieos</td>
<td>€29.99/month for 30 full requests</td>
<td style="text-align: right;">Not enough capacity</td>
<td>You will hit the cap</td>
</tr>
<tr>
<td>Icypeas</td>
<td>10 credits per found profile</td>
<td style="text-align: right;">$19 if 100 hits fit in 1,000 credits</td>
<td>Assumes successful finds</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Usage-based credits, no monthly minimum publicly stated on main site</td>
<td style="text-align: right;">Depends on credit plan</td>
<td>Better if this becomes workflow</td>
</tr>
</tbody>
</table>
<h4 id="scenario-2-500-sdr-or-plg-enrichments-per-month">Scenario 2: 500 SDR or PLG enrichments per month</h4>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Public pricing basis</th>
<th style="text-align: right;">Estimated monthly cost</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mailmeteor</td>
<td>Free browser tool</td>
<td style="text-align: right;">Operationally wrong fit</td>
<td>Manual pain</td>
</tr>
<tr>
<td>Epieos</td>
<td>30 full requests/month</td>
<td style="text-align: right;">Not viable</td>
<td>Wrong category</td>
</tr>
<tr>
<td>Icypeas</td>
<td>10 credits per found profile</td>
<td style="text-align: right;">$89 covers 1,000 lookup credits</td>
<td>Real option</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>API-first, usage-based</td>
<td style="text-align: right;">Depends on plan mix</td>
<td>Better system fit</td>
</tr>
</tbody>
</table>
<h4 id="scenario-3-2000-batch-enrichments-per-month">Scenario 3: 2,000 batch enrichments per month</h4>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Public pricing basis</th>
<th style="text-align: right;">Estimated monthly cost</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mailmeteor</td>
<td>Free browser tool</td>
<td style="text-align: right;">No</td>
<td>Do not do this</td>
</tr>
<tr>
<td>Epieos</td>
<td>30 full requests/month</td>
<td style="text-align: right;">No</td>
<td>Also no</td>
</tr>
<tr>
<td>Icypeas</td>
<td>10 credits per found profile</td>
<td style="text-align: right;">$89 is short, $499 covers 10,000 reverse lookup credits</td>
<td>Watch credit burn</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Usage-based B2B data platform</td>
<td style="text-align: right;">Depends on credits used across person + company workflow</td>
<td>Strongest strategic fit</td>
</tr>
</tbody>
</table>
<p>Volume exposes bad choices fast.</p>
<h2 id="my-hot-takes">My hot takes</h2>
<h3 id="most-reverse-email-lookup-tools-are-optimized-for-demos-not-systems">Most reverse email lookup tools are optimized for demos, not systems</h3>
<p>A search box and result card is not a workflow.</p>
<h3 id="if-your-vendor-touches-linkedin-data-do-not-call-that-a-small-detail">If your vendor touches LinkedIn data, do not call that a small detail</h3>
<p>That stopped being a small detail the moment Proxycurl died.</p>
<h3 id="most-sales-teams-do-not-need-a-generic-reverse-email-lookup-tool">Most sales teams do not need a generic reverse email lookup tool</h3>
<p>They need a <strong>LinkedIn-free person and company enrichment workflow</strong> for work emails.</p>
<h3 id="free-widgets-are-fine-for-curiosity">Free widgets are fine for curiosity</h3>
<p>They are bad for process.</p>
<h2 id="where-ninjapear-fits">Where NinjaPear fits</h2>
<h3 id="not-as-a-generic-people-search-toy">Not as a generic people-search toy</h3>
<p>This matters.</p>
<p>NinjaPear is not for random private-citizen lookup from a Gmail address.</p>
<h3 id="as-the-next-step-after-identifying-a-b2b-contact">As the next step after identifying a B2B contact</h3>
<p>Once you resolve the person, the next useful questions are usually about the company.</p>
<p>That is where the wider workflow matters:</p>
<ul>
<li><a href="https://nubela.co/?ref=nubela.co">Company Details</a> for company enrichment</li>
<li><a href="https://nubela.co/?ref=nubela.co">Employee Count</a> for size context</li>
<li><a href="https://nubela.co/?ref=nubela.co">Customer Listing</a> for account mapping</li>
<li><a href="https://nubela.co/docs?ref=nubela.co">Monitor API</a> for change signals</li>
</ul>
<h3 id="example-workflow">Example workflow</h3>
<ol>
<li>Unknown work email hits your inbox.</li>
<li>Resolve it with NinjaPear Person Profile Endpoint.</li>
<li>Enrich the employer with Company Details and Employee Count.</li>
<li>Run Customer Listing if the account matters.</li>
<li>Add the company to Monitor API so your AE sees changes before the next call.</li>
</ol>
<p>That is a system.</p>
<h2 id="final-verdict">Final verdict</h2>
<h3 id="my-ranked-list">My ranked list</h3>
<ul>
<li><strong>Best free one-off:</strong> Mailmeteor</li>
<li><strong>Best for OSINT:</strong> Epieos</li>
<li><strong>Best pricing transparency among legacy enrichment tools:</strong> Icypeas</li>
<li><strong>Best for B2B work-email reverse lookup:</strong> NinjaPear</li>
</ul>
<h3 id="the-one-i-would-spend-on">The one I would spend on</h3>
<p>If the use case is B2B work-email reverse lookup, I would spend on NinjaPear.</p>
<p>It solves the right problem and avoids the wrong risk.</p>
<h3 id="one-line-verdicts">One-line verdicts</h3>
<ul>
<li><strong>Mailmeteor:</strong> Good free check, not a system.</li>
<li><strong>Epieos:</strong> A sharp OSINT knife, not a revenue engine.</li>
<li><strong>Icypeas:</strong> Refreshingly clear pricing, but ask harder compliance questions.</li>
<li><strong>NinjaPear:</strong> The only option here I’d actually wire into a serious B2B workflow.</li>
</ul>
<h2 id="what-we-said-then-what-changed-what-now">What we said then, what changed, what now</h2>
<table>
<thead>
<tr>
<th>Then</th>
<th>Why it changed</th>
<th>Now</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proxycurl was a strong reverse email lookup recommendation for pro workflows</td>
<td>Proxycurl shut down after LinkedIn filed suit in 2025</td>
<td>Stop treating LinkedIn dependency as a footnote</td>
</tr>
<tr>
<td>Match rate and coverage were the main buying criteria</td>
<td>Legal clarity now matters just as much as capability</td>
<td>Add legal posture to every vendor scorecard</td>
</tr>
<tr>
<td>Reverse email lookup was treated like one market</td>
<td>It is at least three markets: OSINT, B2B work-email enrichment, and people-search</td>
<td>Buy for your actual category</td>
</tr>
<tr>
<td>More data felt automatically better</td>
<td>More data with the wrong substrate can become expensive bullshit</td>
<td>Favor fit, provenance, and operational usefulness</td>
</tr>
</tbody>
</table>
<h2 id="download-the-buyer-kit">Download the Buyer Kit</h2>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="lead-magnet-cta" style="border:1px solid #e0e0e0;border-radius:8px;padding:20px;margin:24px 0;background:#f8f9fb;">
<strong>📥 Free download: Reverse Email Lookup Buyer Kit (2026)</strong><br>
<span style="color:#555;">Use the same vendor scorecard, cost calculator, compliance checklist, and benchmark harness I used to think through this market.</span><br>
<a href="https://f000.backblazeb2.com/file/agent-pub-filestore/reverse-email-lookup-buyer-kit-2026-8b068c95.xlsx?ref=nubela.co" style="display:inline-block;margin-top:10px;padding:8px 14px;background:#1d70b8;color:#fff;border-radius:6px;text-decoration:none;">Download now →</a>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you are evaluating a reverse email lookup vendor this quarter, do three things:</p>
<ol>
<li>Build a scorecard.</li>
<li>Ask where the data comes from.</li>
<li>Model cost at <strong>100</strong>, <strong>500</strong>, and <strong>2,000</strong> lookups.</li>
</ol>
<p>And if your use case is specifically <strong>B2B work-email reverse lookup</strong>, start with NinjaPear's Person Profile Endpoint, then map the workflow into <a href="https://nubela.co/?ref=nubela.co">Company Details</a>, <a href="https://nubela.co/?ref=nubela.co">Employee Count</a>, <a href="https://nubela.co/?ref=nubela.co">Customer Listing</a>, and <a href="https://nubela.co/docs?ref=nubela.co">Monitor API</a>.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing the Similar People Endpoint ]]></title>
        <description><![CDATA[ Recently, a customer reached out to ask if we could help with the following use case:





we would provide a small input set (say, 5 email addresses) and expect the system to return a larger set (e.g., 50) of similar profiles with enriched data.



I&#39;m happy to ]]></description>
        <link>https://nubela.co/blog/introducing-the-similar-people-endpoint/</link>
        <guid isPermaLink="false">69d4b7da1ff0fe0001581494</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 07 Apr 2026 15:55:33 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/similar.png" medium="image"/>
        <content:encoded><![CDATA[ <p>Recently, a customer reached out to ask if we could help with the following use case:</p>
<blockquote>
<p>we would provide a small input set (say, 5 email addresses) and expect the system to return a larger set (e.g., 50) of similar profiles with enriched data.</p>
</blockquote>
<p>I'm happy to introduce the <a href="https://nubela.co/docs/?ref=nubela.co#similar-people-endpoint">Similar People Endpoint</a> today, which takes an input of identifying factors of a person and returns similar people. By <em>similar</em>, I mean people in the same role at competing companies of your target.</p>
<p>For example, these would be my peers, as defined by the Similar People Endpoint:</p>
<blockquote>
<p>Target: Steven Goh — 33 attempted searches, 27 similar people, 175 deci credits (17.5)</p>
<p>Similar people (CEOs/founders at competing data/proxy/scraping companies):</p>
<ol>
<li>Kabiru Mosadoluwa Audullahi — Executive Director, Swiftproxy</li>
<li>Ugnius Zasimauskas — CEO, Coresignal</li>
<li>Yoni Tserruya — Co-founder &amp; CEO, Lusha</li>
<li>Will Cannon — Founder &amp; CEO, UpLead</li>
<li>Karolis Toleikis — Founder &amp; CEO, IPRoyal</li>
<li>Ben Eisenberg — CEO, People Data Labs</li>
<li>Or Lenchner — CEO, Bright Data</li>
<li>Henry L. Schuck — CEO &amp; Chairman, ZoomInfo</li>
<li>Matt Sornson — GM Operations Hub &amp; Breeze Intelligence, HubSpot</li>
<li>Matt Curl — CEO, Apollo.io</li>
<li>Scott Kim — CEO, RocketReach</li>
<li>Yauheni Stsiapnou — CEO, Floppydata</li>
<li>Liam Xavier — Founder &amp; CEO, Scrapeless</li>
<li>Jessica Thompson — CEO &amp; Founder, Thordata</li>
<li>Thibeau Maerevoet — CEO &amp; Founder, Buy Proxy Servers</li>
<li>Ryan Huber — CEO &amp; Co-founder, Defined Networking</li>
<li>Dinesh Gabriel — CEO &amp; Founder, Nebula</li>
<li>Shanelle Roman — Co-Founder &amp; CEO, Nebula Proxy</li>
<li>Denis Mars — Founder &amp; CEO, GoProxy</li>
<li>Aleksandr Sadovskij — CEO &amp; Founder, Proxy-Cheap</li>
<li>Shachar Daniel — CEO &amp; Co-Founder, NetNut</li>
<li>Wolfgang Udo von Kindberg — CEO, Von Kindberg LLC</li>
<li>Sajib Hossain — CEO, ipmela.com</li>
<li>Ignacio Martín Llorente — CEO/MD, OpenNebula</li>
<li>Raymond — Head of R&amp;D, IPcook</li>
<li>Cahyo Subroto — Founder &amp; CEO, MrScraper</li>
<li>Charles Cao — CEO, Nebula Block</li>
</ol>
</blockquote>
<p>This API call took <code>85</code> seconds to complete.</p>
<p>You can think of the Similar People Endpoint as "AI deep research" in the space of B2B data, and honestly, you wouldn't be very far off as to how it works in the background. It is a long-running query. It takes on average 1–2 minutes to complete, and the JSON response is streamed, not unlike LLM tokens.</p>
<h2 id="use-case">Use-case</h2>
<p>The obvious use case for the Similar People Endpoint is expanding prospect lists. For example, what I'll be doing is sending cold emails to similar people for every new user sign-up, as they are immediate good fits.</p>
<h2 id="how-well-does-it-work">How well does it work?</h2>
<p>In live tests against real CEOs, the endpoint returned a full set of same-role peers at competing companies with very high accuracy:</p>
<ul>
<li>Apple — Tim Cook: 18 competitors attempted, 18 similar people returned (100%)</li>
<li>Tesla — Elon Musk: 11 attempted, 11 returned (100%)</li>
<li>Stripe — Patrick Collison: 19 attempted, 16 returned (84%)</li>
</ul>
<p>Beyond executives, we also went down the organization chart and did further tests.</p>
<ul>
<li><strong>Middle manager</strong> — Bryan Irace, Engineering Manager (Link team) @ Stripe
<ul>
<li>Time: 81s · Size: 25.7 KB · Credits: 105</li>
<li>Attempted: 19 · Found: 12 (63%)</li>
<li>Sample matches: Engineering Managers / Heads of Engineering at PayPal, Square, Cash App, Rippling, Tipalti, Finix, Helcim, Stax, FastSpring, Flock — exactly the right archetype (payments-company EMs).</li>
</ul>
</li>
<li><strong>Rank-and-file</strong> — Robert Heaton, Member of Technical Staff @ Stripe
<ul>
<li>Time: ~180s · Size: 65 KB · Credits: 335</li>
<li>Attempted: 65 · Found: 36 (55%)</li>
<li>Matches split into two clusters because Heaton holds multiple current roles in his profile (Stripe + several effective-altruism nonprofits + academia), so the algorithm fanned out across all of them:
<ul>
<li>Engineers at payments competitors: Wise, PayPal, Checkout.com, Square, Cash App, Rippling, Tipalti, Helcim, FastSpring, Paddle, Stax, PaymentCloud</li>
<li>"Member of Technical Staff" peers at AI labs: Anthropic, OpenAI, DeepSeek, Cohere, Meta — picked up via the MTS title alias</li>
<li>Engineers at EA/charity orgs: Giving What We Can, Charity Navigator, Kiva, ACE, CEA, Coefficient Giving</li>
<li>Academics at RCA, Royal Holloway, Surrey — from his secondary teaching/research affiliations</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="accuracy-table">Accuracy table</h3>
<table>
<thead>
<tr>
<th><strong>Tier</strong></th>
<th><strong>Target</strong></th>
<th><strong>Attempted</strong></th>
<th><strong>Found</strong></th>
<th><strong>Yield</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Executive</td>
<td>Tim Cook (Apple)</td>
<td>18</td>
<td>18</td>
<td>100%</td>
</tr>
<tr>
<td>Executive</td>
<td>Elon Musk (Tesla)</td>
<td>11</td>
<td>11</td>
<td>100%</td>
</tr>
<tr>
<td>Executive</td>
<td>Patrick Collison (Stripe)</td>
<td>19</td>
<td>16</td>
<td>84%</td>
</tr>
<tr>
<td>Middle manager</td>
<td>Bryan Irace (Stripe)</td>
<td>19</td>
<td>12</td>
<td>63%</td>
</tr>
<tr>
<td>Rank-and-file</td>
<td>Robert Heaton (Stripe)</td>
<td>65</td>
<td>36</td>
<td>55%</td>
</tr>
</tbody>
</table>
<h3 id="observations">Observations</h3>
<ol>
<li>Yield drops as you go down the org chart. CEOs are public figures listed on every company's leadership page → near-100% hit rate. Mid-level and IC roles depend on per-employee enrichment, which is noisier — yield falls to 55–63%.</li>
<li>Result count goes up the lower you go because the role is held by many people per company. Heaton's 36 matches vs. Cook's 18 reflects that.</li>
<li>Multi-role profiles fan out the search. Heaton's secondary affiliations (EA orgs, academia) generated additional competitor sets and pulled in cross-domain peers — useful if you want full coverage, surprising if you expect a tightly focused list.</li>
</ol>
<h2 id="limitations">Limitations</h2>
<p>Unfortunately, what we are not able to do as of now is return similar employees <strong>within</strong> the same company. That would require maintaining an employee database, which we are currently not doing because—short of scraping LinkedIn, which we will <strong>strictly</strong> never do—how else can we build up such a dataset? I have an idea, but it'll take time to flesh out. You'll be the first to find out when I have something in the pipeline.</p>
<h2 id="try-similar-people-endpoint">Try Similar People Endpoint</h2>
<p>What are you waiting for? Give the Similar People Endpoint a try right now!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ BuiltWith Review 2026: A CEO’s Take on BuiltWith (+ Redditors’ Thoughts) ]]></title>
        <description><![CDATA[ Interactive budget sanity check



Should You Pay for BuiltWith?


Answer four blunt questions. Get a blunt answer. This widget is for people searching builtwith who are really asking: should this be a real line item on my budget?



Default verdict: Don’t buy




1) How many technology filters do you ]]></description>
        <link>https://nubela.co/blog/builtwith-review/</link>
        <guid isPermaLink="false">69d2feb31ff0fe0001581483</guid>
        <category><![CDATA[ builtwith ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 06 Apr 2026 08:30:47 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/cover_2.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<div style="border:1px solid #e5e7eb;border-radius:16px;padding:20px;margin:20px 0 28px;background:linear-gradient(180deg,#ffffff 0%,#f8fafc 100%);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;box-shadow:0 8px 24px rgba(0,0,0,.06);">
  <div style="display:flex;justify-content:space-between;gap:12px;align-items:flex-start;flex-wrap:wrap;">
    <div>
      <div style="font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#6b7280;">Interactive budget sanity check</div>
      <h2 id="should-you-pay-for-builtwith" style="margin:6px 0 4px;font-size:28px;line-height:1.1;color:#111827;">Should You Pay for BuiltWith?</h2>
      <p style="margin:0;color:#4b5563;max-width:720px;">Answer four blunt questions. Get a blunt answer. This widget is for people searching <strong>builtwith</strong> who are really asking: <em>should this be a real line item on my budget?</em></p>
    </div>
    <div id="bwVerdictBadge" style="background:#111827;color:#fff;padding:10px 14px;border-radius:999px;font-size:13px;font-weight:700;">Default verdict: Don’t buy</div>
  </div>

  <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin-top:18px;">
    <div style="background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:16px;">
      <label for="bwFilters" style="display:block;font-weight:700;color:#111827;margin-bottom:10px;">1) How many technology filters do you actually need?</label>
      <input id="bwFilters" type="range" min="1" max="25" value="3" style="width:100%;" />
      <div style="margin-top:8px;color:#4b5563;">Technology filters needed: <strong id="bwFiltersVal">3</strong></div>
    </div>

    <div style="background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:16px;">
      <div style="font-weight:700;color:#111827;margin-bottom:10px;">2) What kind of workflow is this?</div>
      <div style="display:flex;flex-wrap:wrap;gap:8px;">
        <button class="bwChoice active" data-group="workflow" data-value="lookup" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#111827;color:#fff;cursor:pointer;">One-off lookup</button>
        <button class="bwChoice" data-group="workflow" data-value="recurring" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#fff;color:#111827;cursor:pointer;">Recurring prospecting</button>
        <button class="bwChoice" data-group="workflow" data-value="api" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#fff;color:#111827;cursor:pointer;">API workflow</button>
      </div>
    </div>

    <div style="background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:16px;">
      <div style="font-weight:700;color:#111827;margin-bottom:10px;">3) What do you need after the export?</div>
      <div style="display:flex;flex-wrap:wrap;gap:8px;">
        <button class="bwChoice active" data-group="need" data-value="none" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#111827;color:#fff;cursor:pointer;">No contact data needed</button>
        <button class="bwChoice" data-group="need" data-value="enrichment" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#fff;color:#111827;cursor:pointer;">Need contact enrichment</button>
        <button class="bwChoice" data-group="need" data-value="signals" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#fff;color:#111827;cursor:pointer;">Need intent + change signals</button>
      </div>
    </div>

    <div style="background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:16px;">
      <div style="font-weight:700;color:#111827;margin-bottom:10px;">4) Who is this for?</div>
      <div style="display:flex;flex-wrap:wrap;gap:8px;">
        <button class="bwChoice active" data-group="team" data-value="solo" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#111827;color:#fff;cursor:pointer;">One operator</button>
        <button class="bwChoice" data-group="team" data-value="small" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#fff;color:#111827;cursor:pointer;">2–5 seats</button>
        <button class="bwChoice" data-group="team" data-value="team" style="padding:10px 12px;border-radius:10px;border:1px solid #cbd5e1;background:#fff;color:#111827;cursor:pointer;">Actual GTM team</button>
      </div>
    </div>
  </div>

  <div id="bwOutput" style="margin-top:18px;background:#0f172a;color:#fff;border-radius:16px;padding:18px;display:grid;grid-template-columns:1.1fr .9fr;gap:16px;align-items:start;">
    <div>
      <div style="font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#93c5fd;">Recommended path</div>
      <div id="bwPath" style="font-size:30px;font-weight:800;line-height:1.1;margin:6px 0 10px;">Don’t buy</div>
      <div id="bwVerdict" style="font-size:16px;line-height:1.5;color:#dbeafe;">You do not need a $495/mo technographic habit.</div>
    </div>
    <div style="background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);border-radius:14px;padding:14px;">
      <div style="display:flex;justify-content:space-between;gap:12px;margin-bottom:8px;"><span style="color:#cbd5e1;">Estimated monthly software cost</span><strong id="bwCost">$0–$50</strong></div>
      <div style="display:flex;justify-content:space-between;gap:12px;margin-bottom:8px;"><span style="color:#cbd5e1;">Suggested stack</span><strong id="bwStack" style="text-align:right;">Free lookup only</strong></div>
      <div style="font-size:12px;line-height:1.5;color:#94a3b8;margin-top:10px;">Assumes public BuiltWith pricing of Basic <strong>$295/mo</strong>, Pro <strong>$495/mo</strong>, Team <strong>$995/mo</strong>, plus likely downstream enrichment if you need actual outreach.</div>
    </div>
  </div>

  <script>
    (function(){
      const state = { filters: 3, workflow: 'lookup', need: 'none', team: 'solo' };
      const $ = (id) => document.getElementById(id);
      const filters = $('bwFilters');
      const filtersVal = $('bwFiltersVal');
      const path = $('bwPath');
      const verdict = $('bwVerdict');
      const cost = $('bwCost');
      const stack = $('bwStack');
      const badge = $('bwVerdictBadge');

      function setActive(group, value){
        document.querySelectorAll('.bwChoice').forEach(btn => {
          if(btn.dataset.group === group){
            const active = btn.dataset.value === value;
            btn.classList.toggle('active', active);
            btn.style.background = active ? '#111827' : '#fff';
            btn.style.color = active ? '#fff' : '#111827';
          }
        });
      }

      function compute(){
        let rec = { path: 'Don’t buy', cost: '$0–$50', verdict: 'You do not need a $495/mo technographic habit.', stack: 'Free lookup only' };
        const f = state.filters, w = state.workflow, n = state.need, t = state.team;

        if (w === 'lookup' && f <= 3 && n === 'none' && t === 'solo') {
          rec = { path: 'Free lookup', cost: '$0–$50', verdict: 'Use the free lookup and move on with your life.', stack: 'BuiltWith only' };
        } else if (w !== 'api' && f <= 2 && n === 'none' && t === 'solo') {
          rec = { path: 'Basic', cost: '~$295/mo', verdict: 'Basic only makes sense when your ICP is brutally narrow and you know exactly what you are hunting.', stack: 'BuiltWith only' };
        } else if ((w === 'recurring' || f > 2) && t !== 'team' && n !== 'signals') {
          rec = { path: 'Pro', cost: '~$495/mo + enrichment', verdict: 'This is the first plan that feels like a real operating plan, not a teaser.', stack: n === 'enrichment' ? 'BuiltWith + enrichment' : 'BuiltWith only' };
        }
        if (w === 'api') {
          rec = { path: t === 'team' ? 'Team' : 'Pro', cost: t === 'team' ? '~$995/mo + engineering' : '~$495/mo + engineering', verdict: 'Usable for deliberate workflows. Not an infinite firehose. Talk to engineering before your sales team says “we’ll pipe it into everything.”', stack: n === 'none' ? 'BuiltWith only' : 'BuiltWith + enrichment' };
        }
        if (t === 'team' && (w === 'recurring' || w === 'api')) {
          rec = { path: 'Team', cost: '~$995/mo + stack costs', verdict: 'Only approve Team if multiple people are repeatedly monetizing exports and insights.', stack: n === 'signals' ? 'Skip to broader workflow' : 'BuiltWith + enrichment' };
        }
        if (n === 'signals') {
          rec = { path: 'Don’t buy', cost: '~$300–$1,500+ elsewhere', verdict: 'If you need intent and change signals too, BuiltWith is only solving the first 20% of the problem.', stack: 'Skip to a different workflow' };
        }
        if (w === 'lookup' && n !== 'none') {
          rec = { path: 'Don’t buy', cost: '~$0–$200 elsewhere', verdict: 'One-off lookups do not justify a recurring technographics bill plus enrichment cleanup.', stack: 'Skip to a different workflow' };
        }

        path.textContent = rec.path;
        verdict.textContent = rec.verdict;
        cost.textContent = rec.cost;
        stack.textContent = rec.stack;
        badge.textContent = 'Verdict: ' + rec.path;
      }

      filters.addEventListener('input', function(){
        state.filters = parseInt(this.value, 10);
        filtersVal.textContent = this.value;
        compute();
      });

      document.querySelectorAll('.bwChoice').forEach(btn => {
        btn.addEventListener('click', function(){
          state[this.dataset.group] = this.dataset.value;
          setActive(this.dataset.group, this.dataset.value);
          compute();
        });
      });

      compute();
    })();
  </script>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>I’ve watched smart teams burn a very stupid amount of money on <strong>BuiltWith</strong> because they confused a CSV of websites with actual pipeline.</p>
<p>That’s the whole review in one sentence.</p>
<p>BuiltWith is real. It’s useful. It has legitimate depth. It is also one of those tools that gets overbought by people who need “accounts + contacts + timing + prioritization” and end up paying for “websites that appear to use X.” Those are not the same thing. Not even close.</p>
<p>I’m writing this as someone who has signed the software checks, cleaned up the fallout, and had to explain to a founder why a list of 40,000 domains turned into a few hundred verified contacts and a lot of wasted SDR hours. That distinction matters.</p>
<h2 id="tldr">TL;DR</h2>
<p>If you just want the adult answer, here it is.</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>BuiltWith</th>
<th>Wappalyzer</th>
<th>Ful.io</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Best for one-off lookup</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>Wappalyzer</strong></td>
</tr>
<tr>
<td>Best for narrow technographic prospecting</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>BuiltWith</strong></td>
</tr>
<tr>
<td>Historical tech trend depth</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>BuiltWith</strong></td>
</tr>
<tr>
<td>Entry pricing sanity</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>Ful.io</strong></td>
</tr>
<tr>
<td>Team workflow viability</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>Wappalyzer</strong></td>
</tr>
<tr>
<td>API practicality</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>Wappalyzer</strong></td>
</tr>
<tr>
<td>Useful beyond front-end tech detection</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td><strong>None of them</strong></td>
</tr>
<tr>
<td>“Ready-to-run pipeline” out of the box</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>None of them</strong></td>
</tr>
<tr>
<td>Overall score</td>
<td><strong>3.17/5</strong></td>
<td><strong>3.92/5</strong></td>
<td><strong>3.67/5</strong></td>
<td><strong>Wappalyzer</strong></td>
</tr>
</tbody>
</table>
<p>My quick read:</p>
<ul>
<li><strong>Buy BuiltWith</strong> if your ICP is tightly anchored to 1-2 technologies, or you care about historical adoption/migration data enough to monetize it.</li>
<li><strong>Use free lookup / cheaper alternatives</strong> if you’re a solo operator doing ad hoc research.</li>
<li><strong>Do not buy BuiltWith</strong> if what you really need is contacts, buying intent, org changes, or account prioritization.</li>
<li><strong>All the front-end scanners share the same structural limitation:</strong> they mainly infer from the public website surface. That is useful. It is not the same as understanding customers, relationships, or timing.</li>
<li><strong>A CSV of websites is not pipeline.</strong> Stop pretending otherwise.</li>
</ul>
<h2 id="the-ceo-verdict-should-you-pay-for-builtwith-at-all">The CEO verdict: should you pay for BuiltWith at all?</h2>
<p>Yes. In exactly two situations.</p>
<p>Not five. Not “it depends.” Two.</p>
<h3 id="the-2-situations-where-id-approve-budget">The 2 situations where I’d approve budget</h3>
<p><strong>1. You have a narrow ICP defined by specific technologies.</strong></p>
<p>If I’m selling into, say, Shopify Plus stores running Klaviyo with a certain spend profile and I can monetize that list fast, BuiltWith can absolutely print money. That’s because its tech coverage is broad, its filtering is serious, and its exportability is actually useful when you already know the hunt.</p>
<p><strong>2. You care about historical adoption trends enough to make money from them.</strong></p>
<p>This is the part people underrate. Investors, analysts, strategy teams, ecosystem partners — these people can get real value from seeing who adopted, dropped, or migrated over time. BuiltWith’s homepage mentions trends, but honestly that undersells the strategic value of the historical layer.</p>
<h3 id="the-situations-where-id-say-no">The situations where I’d say no</h3>
<p><strong>Solo founders doing occasional lookups.</strong> Use the free lookup or pay for something lighter.</p>
<p><strong>Teams expecting contact data and ready-to-run outbound lists.</strong> BuiltWith does not magically turn websites into reachable people.</p>
<p><strong>Companies confusing technographics with buying intent.</strong> This is the big self-own. A company using HubSpot is not automatically in market. A company using Shopify is not automatically a good customer. A company changing leadership, hiring for a replatform, launching a new product line, or ripping up its pricing page? Now we’re getting somewhere.</p>
<p>My verdict is simple: <strong>BuiltWith deserves budget when the use case is brutally specific. Otherwise it becomes expensive software theater.</strong></p>
<h2 id="builtwith-scorecard">BuiltWith Scorecard</h2>
<p>Here’s the scorecard I’d hand to a CEO or RevOps lead.</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Rating</th>
<th>CEO note</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data freshness</td>
<td>⭐⭐⭐☆☆</td>
<td>Useful, but I would still validate high-value accounts before outreach</td>
</tr>
<tr>
<td>Data richness</td>
<td>⭐⭐⭐⭐☆</td>
<td>Broad coverage and decent metadata beyond simple script detection</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐☆☆</td>
<td>Scales, but not infinitely and not without workflow design</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
<td>Entry plan feels more like a teaser than a serious operating plan</td>
</tr>
<tr>
<td>Developer friendliness</td>
<td>⭐⭐⭐☆☆</td>
<td>Usable docs, but engineering still has to care</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐⭐⭐⭐☆</td>
<td>Established product, not some sketchy side project</td>
</tr>
<tr>
<td>Beyond front-end visibility</td>
<td>⭐⭐☆☆☆</td>
<td>Like Wappalyzer and peers, it mainly sees what the public site reveals</td>
</tr>
<tr>
<td><strong>Overall</strong></td>
<td><strong>3.17/5</strong></td>
<td><strong>Good product, easy to overbuy</strong></td>
</tr>
</tbody>
</table>
<p>That last line is the whole thing.</p>
<p>Good product. Easy to overbuy.</p>
<h2 id="what-builtwith-is-actually-good-at">What BuiltWith is actually good at</h2>
<p>I want to give the tool real credit before I start swinging at its budget logic.</p>
<h3 id="breadth-of-technology-coverage-is-legitimately-strong">Breadth of technology coverage is legitimately strong</h3>
<p>BuiltWith publicly says it covers <strong>113,124+ internet technologies</strong>. On the homepage, it also claims tech trend data back to <strong>January 1985</strong>, over <strong>2,500 eCommerce technologies</strong>, and <strong>2 billion unique eCommerce products</strong> across <strong>26 million eCommerce websites</strong>.</p>
<p>That’s not nothing. That’s a real crawl/indexing operation.</p>
<p>If you’re trying to understand ecosystem structure — who uses Shopify vs BigCommerce, who has Salesforce installed, which ecommerce segment is leaning into Klaviyo, which category is consolidating around one stack — breadth matters. A lot.</p>
<p><img alt="BuiltWith homepage and search experience" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/10eda9904458.webp" /></p>
<h3 id="historical-trend-data-is-more-valuable-than-the-homepage-explains">Historical trend data is more valuable than the homepage explains</h3>
<p>Most people think BuiltWith is just a website profiler. That’s the shallow read.</p>
<p>The deeper value is historical movement. <code>first detected</code>, <code>last detected</code>, stack shifts, category-level usage trends — that’s where the tool starts becoming useful for market mapping instead of just SDR list pulling.</p>
<p>When I was running outbound experiments years ago, the best technographic campaigns were never “all users of X.” They were “companies likely transitioning away from Y into X” or “businesses that recently crossed into a maturity band where this tool becomes relevant.” That’s a much better bet.</p>
<h3 id="the-free-lookup-still-has-real-utility">The free lookup still has real utility</h3>
<p>I’m not above saying the obvious: the free lookup is handy.</p>
<p>For founders, PMMs, SDRs, agency operators, or anyone doing ad hoc research on a single domain, it solves a real problem in seconds. If your actual need is “what does this site appear to run?” the free product already gets you a decent amount of value.</p>
<p>And honestly, that’s why a lot of people should stop there.</p>
<h2 id="the-big-limitation-nobody-says-loudly-enough-builtwith-only-sees-the-website-surface">The big limitation nobody says loudly enough: BuiltWith only sees the website surface</h2>
<p>This is the structural caveat for <strong>BuiltWith</strong>, <strong>Wappalyzer</strong>, <strong>Ful.io</strong>, and basically the whole front-end scanner category.</p>
<p>They are mostly inferring from what can be detected on or around a public-facing website:</p>
<ul>
<li>JavaScript libraries</li>
<li>analytics tags</li>
<li>CMS footprints</li>
<li>marketing pixels</li>
<li>widgets</li>
<li>ecommerce platform clues</li>
<li>CDN / hosting / SSL / DNS-adjacent signals</li>
<li>page-source and request-level artifacts</li>
</ul>
<p>That is useful. Sometimes very useful.</p>
<p>But it is still a partial view.</p>
<p>What they usually <strong>cannot</strong> tell you with confidence just from front-end tech detection:</p>
<ul>
<li>who the company’s customers are</li>
<li>who buys from them repeatedly</li>
<li>what contracts or commercial relationships exist</li>
<li>whether they are actively evaluating a new vendor right now</li>
<li>whether budget got approved this quarter</li>
<li>whether a buyer just joined and is about to rip out the old stack</li>
<li>which internal system is mission-critical but completely invisible on the public site</li>
</ul>
<p>And this is exactly where teams get sloppy.</p>
<p>They see a clean list of websites using some stack and mentally upgrade that into “market map,” “pipeline,” or “intent.” It is none of those things by default.</p>
<p>A website might show HubSpot, Segment, Shopify, or Marketo in the front end. Fine. That still tells you almost nothing about:</p>
<ul>
<li>the company’s customer base</li>
<li>their actual vendor contracts beyond visible scripts</li>
<li>internal tools hidden behind auth</li>
<li>procurement timing</li>
<li>account health</li>
<li>who the real buyer is</li>
</ul>
<p>Put more bluntly: <strong>front-end tech scanners are about website-observable tech, not total company intelligence.</strong></p>
<p>That limitation is not a bug unique to BuiltWith. It is the entire category.</p>
<h3 id="why-this-matters-more-than-people-think">Why this matters more than people think</h3>
<p>If your go-to-market hypothesis is literally tied to visible web tech, great. BuiltWith can help.</p>
<p>If your real question is:</p>
<ul>
<li>“Who are this company’s customers?”</li>
<li>“Which accounts look like my best current customers?”</li>
<li>“What changed this week that opens a window?”</li>
<li>“Who competes with them and who do they sell to?”</li>
</ul>
<p>…then a front-end scanner is the wrong center of gravity.</p>
<p>That’s where there is a whole different paradigm of data that has nothing to do with scraping visible JavaScript off a homepage.</p>
<p>For example, NinjaPear’s <strong>Customer Listing API</strong> maps <strong>customers, investors, and partners</strong> for a company based on its website. That is a completely different question from “what scripts are on the page?” It gets you into relationship intelligence rather than front-end fingerprinting.</p>
<p>That distinction matters because a lot of revenue teams do not actually need better tech detection. They need to know:</p>
<ul>
<li>who buys from a company</li>
<li>who overlaps with their existing customer base</li>
<li>who just changed direction</li>
<li>what is happening around an account right now</li>
</ul>
<p>That is why I keep saying most companies do not have a BuiltWith problem. They have an account selection and timing problem.</p>
<h2 id="where-builtwith-starts-to-get-expensive-and-annoying">Where BuiltWith starts to get expensive and annoying</h2>
<p>This is where the CEO lens matters. Sticker price is only half the story.</p>
<h3 id="the-pricing-looks-cleaner-than-the-actual-operating-reality">The pricing looks cleaner than the actual operating reality</h3>
<p>Public pricing is straightforward enough:</p>
<ul>
<li><strong>Basic: $295/mo</strong></li>
<li><strong>Pro: $495/mo</strong></li>
<li><strong>Team: $995/mo</strong></li>
</ul>
<p>BuiltWith’s own knowledge base adds useful context:</p>
<ul>
<li><strong>Basic</strong> gives you <strong>two technologies</strong> and <strong>2,000 upload analysis credits/month</strong></li>
<li><strong>Pro</strong> gives you <strong>unlimited technologies</strong> and <strong>20,000 upload analysis credits/month</strong></li>
<li><strong>Team</strong> is described as <strong>unlimited everything except API credits</strong> with <strong>1.2M/year or 100,000/month</strong> API credits</li>
</ul>
<p>The pricing page and KB aren’t perfectly cleanly aligned on the Team monthly number (the KB also references <strong>$9,950/year or $950/month</strong>). That kind of mismatch is not fatal, but it’s exactly the sort of detail that makes finance people grumpy.</p>
<p>My real issue is simpler: <strong>$295/month sounds survivable until you realize the Basic plan is restrictive enough that any serious experimentation pushes you up-market fast.</strong></p>
<h3 id="tech-detection-is-not-the-same-thing-as-a-revenue-ready-lead-list">Tech detection is not the same thing as a revenue-ready lead list</h3>
<p>This is the biggest workflow lie in the whole category.</p>
<p>A technographic list without contactability is half a workflow pretending to be a full workflow.</p>
<p>One Reddit thread captured this perfectly.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border-left:3px solid #ff4500;padding:12px 16px;margin:16px 0;background:#f8f9fa;border-radius:4px;font-family:-apple-system,sans-serif;">
  <div style="color:#787c7e;font-size:13px;margin-bottom:8px;">
    <strong>u/Certain-Glass4372</strong> on r/coldemail · ↑4
  </div>
  <div style="color:#1a1a1b;font-size:14px;line-height:1.5;">BuiltWith was terrible. Out of 40,000 leads, I ended up being routed through Apollo and only got 400 verified.</div>
  <a href="https://www.reddit.com/r/coldemail/comments/1ojcj5t/ecommerce_leads/?ref=nubela.co" style="color:#787c7e;font-size:12px;">source</a>
</div>

<div style="font-size:12px;color:#6b7280;margin-top:-8px;">Anecdotal user feedback, not universal truth.</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That comment is anecdotal, not gospel. But the workflow pain is real.</p>
<p>And the reply underneath was even more useful than the complaint.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border-left:3px solid #ff4500;padding:12px 16px;margin:16px 0;background:#f8f9fa;border-radius:4px;font-family:-apple-system,sans-serif;">
  <div style="color:#787c7e;font-size:13px;margin-bottom:8px;">
    <strong>u/Tasty_Amount6342</strong> on r/coldemail · ↑2
  </div>
  <div style="color:#1a1a1b;font-size:14px;line-height:1.5;">BuiltWith gives you lists of companies using specific tech, but it doesn't give you contact data. That's why when you ran it through Apollo only 400 had verified emails.</div>
  <a href="https://www.reddit.com/r/coldemail/comments/1ojcj5t/ecommerce_leads/?ref=nubela.co" style="color:#787c7e;font-size:12px;">source</a>
</div>

<div style="font-size:12px;color:#6b7280;margin-top:-8px;">Anecdotal user feedback, not universal truth.</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the category in one paragraph.</p>
<h3 id="most-buyers-underestimate-the-cleanup-cost-after-export">Most buyers underestimate the cleanup cost after export</h3>
<p>This is the part nobody wants to budget for because it makes the “cheap list” look expensive.</p>
<p>After export, you still need:</p>
<ul>
<li>contact enrichment</li>
<li>email verification</li>
<li>account prioritization</li>
<li>timing signal validation</li>
<li>CRM sync and dedupe</li>
<li>human judgment on edge cases and junk accounts</li>
</ul>
<p>So no, the real cost is not <strong>$295</strong> or <strong>$495</strong>.</p>
<p>The real cost is the rest of the stack plus the labor you now need to make the CSV usable.</p>
<h3 id="support-and-onboarding-friction-should-be-noted-even-if-its-anecdotal">Support and onboarding friction should be noted, even if it’s anecdotal</h3>
<p>I found one Reddit complaint from someone trying to buy the product who couldn’t get through ID verification and said support was unresponsive.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border-left:3px solid #ff4500;padding:12px 16px;margin:16px 0;background:#f8f9fa;border-radius:4px;font-family:-apple-system,sans-serif;">
  <div style="color:#787c7e;font-size:13px;margin-bottom:8px;">
    <strong>u/phb71</strong> on r/coldemail · ↑1
  </div>
  <div style="color:#1a1a1b;font-size:14px;line-height:1.5;">I've been trying to create and pay for an account on builtwith for weeks and it's impossible - there is an ID verification that never got through and support is unresponsive. Crazy to think I am ready to spend money and they won't take it...</div>
  <a href="https://www.reddit.com/r/coldemail/comments/1h11l6r/builtwith_alternatives/?ref=nubela.co" style="color:#787c7e;font-size:12px;">source</a>
</div>

<div style="font-size:12px;color:#6b7280;margin-top:-8px;">Anecdotal user feedback, not universal truth.</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Again: anecdotal, not universal truth.</p>
<p>But if a tool is hard to buy, hard to onboard, or weirdly finicky at the moment the customer is trying to give you money, that absolutely belongs in the ROI conversation.</p>
<h2 id="builtwith-pricing-in-2026-the-real-cost-is-not-the-subscription">BuiltWith pricing in 2026 — the real cost is not the subscription</h2>
<p>This is where I’d force a CFO and a sales leader to sit in the same room for 20 minutes.</p>
<h3 id="what-each-plan-actually-means-in-practice">What each plan actually means in practice</h3>
<table>
<thead>
<tr>
<th>Plan</th>
<th style="text-align: right;">Public price</th>
<th>What it really means</th>
<th>Who should approve this spend?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Basic</td>
<td style="text-align: right;">$295/mo</td>
<td>Two-technology scope, narrow hunts, limited experimentation</td>
<td>Only if your ICP is painfully specific</td>
</tr>
<tr>
<td>Pro</td>
<td style="text-align: right;">$495/mo</td>
<td>First plan that feels viable for recurring list building</td>
<td>A team that will run sustained tests every month</td>
</tr>
<tr>
<td>Team</td>
<td style="text-align: right;">$995/mo (KB also references $950/mo or $9,950/yr)</td>
<td>Shared use, repeated exports, larger ops muscle</td>
<td>Only if multiple users are actively monetizing it</td>
</tr>
<tr>
<td>Advanced</td>
<td style="text-align: right;">$144/yr</td>
<td>Detailed individual site lookups, not lead-gen operations</td>
<td>Solo users doing research, not pipeline building</td>
</tr>
</tbody>
</table>
<p>Basic is not “starter.” It’s “you already know what you’re doing.”</p>
<p>Pro is the first plan I’d consider operationally viable.</p>
<p>Team only makes sense if the output is feeding a repeatable machine, not a random collection of experiments.</p>
<h3 id="the-hidden-budget-line-items-nobody-mentions">The hidden budget line items nobody mentions</h3>
<p>Here is the budget that actually shows up in real life.</p>
<table>
<thead>
<tr>
<th>Cost line item</th>
<th style="text-align: right;">Low-end monthly</th>
<th style="text-align: right;">More realistic monthly</th>
<th>Why it exists</th>
</tr>
</thead>
<tbody>
<tr>
<td>BuiltWith subscription</td>
<td style="text-align: right;">$295</td>
<td style="text-align: right;">$495</td>
<td>You need the raw technographic list</td>
</tr>
<tr>
<td>Enrichment tool (Apollo/Clay/etc.)</td>
<td style="text-align: right;">$99</td>
<td style="text-align: right;">$500+</td>
<td>You still need people and contact data</td>
</tr>
<tr>
<td>Verification tool</td>
<td style="text-align: right;">$25</td>
<td style="text-align: right;">$150</td>
<td>Because bounce rates will punish lazy workflows</td>
</tr>
<tr>
<td>SDR cleanup time</td>
<td style="text-align: right;">$300</td>
<td style="text-align: right;">$1,500+</td>
<td>Someone has to dedupe, validate, prioritize</td>
</tr>
<tr>
<td>CRM/ops overhead</td>
<td style="text-align: right;">$100</td>
<td style="text-align: right;">$500</td>
<td>Sync, routing, field mapping, dedupe</td>
</tr>
<tr>
<td>Engineering time for API workflows</td>
<td style="text-align: right;">$0</td>
<td style="text-align: right;">$1,000+ amortized</td>
<td>Only “free” if you ignore internal labor</td>
</tr>
<tr>
<td><strong>Estimated all-in</strong></td>
<td style="text-align: right;"><strong>$819</strong></td>
<td style="text-align: right;"><strong>$4,145+</strong></td>
<td><strong>This is the real budget conversation</strong></td>
</tr>
</tbody>
</table>
<p>That’s why I get annoyed when someone says “BuiltWith is only $295/month.”</p>
<p>No. BuiltWith is only $295/month <strong>if the CSV itself is the outcome</strong>. In most sales orgs, it isn’t.</p>
<h3 id="a-simple-roi-mini-model">A simple ROI mini-model</h3>
<p>Let’s do the boring math because the boring math is what saves you.</p>
<p>Assume:</p>
<ul>
<li>you export <strong>10,000 domains</strong></li>
<li>only <strong>10%</strong> become reachable contacts after enrichment + verification</li>
<li>only <strong>2%</strong> of those turn into qualified conversations</li>
</ul>
<p>That leaves you with:</p>
<ul>
<li><strong>1,000 reachable accounts</strong></li>
<li><strong>20 qualified conversations</strong></li>
</ul>
<p>Now let’s price it.</p>
<p>If your all-in monthly cost is a conservative <strong>$1,000</strong>, that’s:</p>
<ul>
<li><strong>$1.00 per reachable account</strong></li>
<li><strong>$50 per qualified conversation</strong></li>
</ul>
<p>Not bad.</p>
<p>But if your true monthly cost is closer to <strong>$3,000</strong> after enrichment, verification, ops time, and cleanup, then you’re at:</p>
<ul>
<li><strong>$3.00 per reachable account</strong></li>
<li><strong>$150 per qualified conversation</strong></li>
</ul>
<p>Still maybe fine.</p>
<p>Now add reality: low-fit accounts, stale detections, unreachable owners, and weak timing. Suddenly your “cheap technographic list” can get expensive as hell.</p>
<h2 id="builtwith-api-review-usable-but-not-the-firehose-people-imagine">BuiltWith API review — usable, but not the firehose people imagine</h2>
<p>I care about systems. So let’s talk docs.</p>
<h3 id="what-the-docs-say">What the docs say</h3>
<p>BuiltWith’s public Domain API docs say:</p>
<ul>
<li><strong>Maximum 8 concurrent requests</strong></li>
<li><strong>Maximum 10 requests per second</strong> before you hit <strong>429</strong> errors</li>
<li>The <strong>free API</strong> is rate limited to <strong>1 request per second</strong></li>
</ul>
<p>That’s not me editorializing. That’s in the docs.</p>
<h3 id="api-constraints-table">API constraints table</h3>
<table>
<thead>
<tr>
<th>API factor</th>
<th>BuiltWith public doc detail</th>
<th>My take</th>
</tr>
</thead>
<tbody>
<tr>
<td>Concurrent requests</td>
<td>8 max</td>
<td>Fine for moderate workflows, not massive fan-out</td>
</tr>
<tr>
<td>Requests per second</td>
<td>10 max</td>
<td>Enough for deliberate enrichment, not “spray everything”</td>
</tr>
<tr>
<td>Free API rate limit</td>
<td>1 req/sec</td>
<td>Good for testing, not production ambition</td>
</tr>
<tr>
<td>429 behavior</td>
<td>Explicitly documented</td>
<td>Your engineering team needs backoff logic</td>
</tr>
<tr>
<td>Team plan API credits</td>
<td>100,000/month per KB</td>
<td>Useful, but absolutely finite</td>
</tr>
</tbody>
</table>
<h3 id="why-this-matters-operationally">Why this matters operationally</h3>
<p>This is perfectly workable for moderate enrichment and internal tools.</p>
<p>It is not a magic infinite stream.</p>
<p>If your team says, “we’ll just pipe this into everything,” they need to speak to engineering first. Preferably before promising a quarter’s worth of automation on a whiteboard.</p>
<h3 id="my-take-as-someone-who-cares-about-systems-not-toy-demos">My take as someone who cares about systems, not toy demos</h3>
<p>The API is good enough for deliberate workflows.</p>
<p>It is not the kind of thing I’d describe as infinitely flexible unless I wanted to create pain for my own team later.</p>
<p>That’s not a knock. It’s just adult software planning.</p>
<h2 id="hands-on-benchmark-what-i-could-actually-verify">Hands-on benchmark: what I could actually verify</h2>
<p>I’m not going to fake a lab benchmark I can’t access cleanly. No fake dashboards. No fake receipts. No bullshit.</p>
<p>What I <em>could</em> verify publicly for this article was:</p>
<ul>
<li>BuiltWith homepage and free lookup entry point</li>
<li>BuiltWith pricing and plan details from public pages/docs</li>
<li>BuiltWith detailed domain lookup attempts hit a human-test gate during browsing</li>
<li>Wappalyzer public pricing and workflow positioning</li>
<li>Ful.io public pricing and workflow positioning</li>
<li>The category-wide limitation that these tools mainly operate off front-end / website-observable signals</li>
</ul>
<p>Here’s the BuiltWith lookup attempt on <code>wayfair.com</code> in the browser during research. It hit a loading/human-test wall before a readable detailed report rendered.</p>
<p><img alt="BuiltWith detailed profile attempt hitting loading/human gate" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/11ebca7ae88b.webp" /></p>
<p>That itself is worth noting. A public lookup flow that gets stuck on anti-bot/human checks is not the end of the world, but it does limit frictionless verification during research.</p>
<h3 id="lightweight-benchmark-score-table">Lightweight benchmark score table</h3>
<p>Since I could not credibly run the full 25-domain export benchmark without authenticated access and stable report rendering, I’m publishing the smaller benchmark I could stand behind.</p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>BuiltWith</th>
<th>Wappalyzer</th>
<th>Ful.io</th>
<th>Winner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Public pricing transparency</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>Wappalyzer / Ful.io</strong></td>
</tr>
<tr>
<td>Free/public research accessibility</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>Wappalyzer / Ful.io</strong></td>
</tr>
<tr>
<td>Historical trend positioning</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>BuiltWith</strong></td>
</tr>
<tr>
<td>Commercial lead-gen seriousness</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>BuiltWith / Wappalyzer</strong></td>
</tr>
<tr>
<td>Depth beyond front-end observability</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td><strong>None of them</strong></td>
</tr>
<tr>
<td>Friction during public testing</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>Wappalyzer / Ful.io</strong></td>
</tr>
</tbody>
</table>
<p>If I get stable authenticated access later, I’d happily publish the full 25-domain benchmark with raw CSVs. But I’m not inventing a test result just to make the article look complete.</p>
<h2 id="builtwith-vs-the-alternatives-a-ceo-should-actually-consider">BuiltWith vs the alternatives a CEO should actually consider</h2>
<p>Don’t compare everything to everything. Compare the job-to-be-done.</p>
<h3 id="builtwith-vs-wappalyzer">BuiltWith vs Wappalyzer</h3>
<p>Wappalyzer’s public pricing is cleaner and, frankly, easier to justify for many teams.</p>
<p>Their pricing page currently shows:</p>
<ul>
<li><strong>Pro: $250/mo</strong></li>
<li><strong>Business: $450/mo</strong></li>
<li><strong>Enterprise: $850+/mo</strong></li>
<li>Free account with <strong>50 technology lookups/month</strong> and sample lead lists</li>
</ul>
<p>It also clearly spells out features like:</p>
<ul>
<li><strong>5,000 lookups</strong> on Pro</li>
<li><strong>20,000 lookups</strong> on Business</li>
<li>API credits included from Business upward</li>
<li>CRM enrichment on Business+</li>
</ul>
<p><img alt="Wappalyzer pricing" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/44c80ab6740e.webp" /></p>
<p>My take:</p>
<ul>
<li><strong>Wappalyzer is better for cheaper, simpler, operator-level lookup and lighter team workflows.</strong></li>
<li><strong>BuiltWith is better for bigger historical-trend work and mature commercial technographic prospecting.</strong></li>
</ul>
<p>If I’m a solo operator, I probably start with Wappalyzer.</p>
<p>If I’m an investor, analyst, or a niche ecosystem seller with a sharp ICP, BuiltWith starts making more sense.</p>
<h3 id="builtwith-vs-fulio">BuiltWith vs Ful.io</h3>
<p>Ful.io’s public pricing undercuts BuiltWith hard:</p>
<ul>
<li><strong>Individual: $149/mo</strong> with <strong>2 lead intelligence technologies</strong></li>
<li><strong>Professional: $249/mo</strong> with <strong>5 technologies</strong> and <strong>2,000 API credits</strong></li>
<li><strong>Business: $399/mo</strong> with <strong>25 technologies</strong> and <strong>20,000 API credits</strong></li>
<li>Free account with <strong>25 technology lookups</strong> and <strong>5 email searches/month</strong></li>
</ul>
<p><img alt="Ful.io pricing" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/04/4e5e4494445d.webp" /></p>
<p>Ful.io also positions itself more directly around lead intelligence and includes email-search language on the public site, which matters if you’re trying to close the workflow gap faster.</p>
<p>My take:</p>
<ul>
<li><strong>Ful.io is a more budget-conscious option for some teams.</strong></li>
<li><strong>BuiltWith feels stronger on maturity, brand trust, and historical depth.</strong></li>
<li>If your team is experimenting and cost-sensitive, Ful.io deserves a look.</li>
</ul>
<h3 id="builtwith-vs-a-broader-company-intelligence-workflow">BuiltWith vs a broader company-intelligence workflow</h3>
<p>This is the strategic distinction most buyers miss.</p>
<p>BuiltWith answers:</p>
<blockquote>
<p><strong>What technology does this website appear to use?</strong></p>
</blockquote>
<p>A broader company-intelligence workflow answers:</p>
<blockquote>
<p><strong>Who buys from them, who competes with them, what changed recently, and what’s happening around the company?</strong></p>
</blockquote>
<p>That’s why I keep saying a lot of teams buy technographics when the real problem is account intelligence and timing.</p>
<p>If what you actually need is:</p>
<ul>
<li>customer and partner mapping</li>
<li>competitor mapping</li>
<li>company monitoring</li>
<li>leadership/team changes</li>
<li>product, pricing, or messaging shifts</li>
</ul>
<p>…then technographics alone is the wrong center of gravity.</p>
<p>That’s where something like NinjaPear fits naturally <strong>after</strong> detection, not instead of it. BuiltWith can help you identify a stack-based slice of the market. NinjaPear is for understanding what’s actually happening around those accounts so you don’t reach out at the wrong damn time.</p>
<p>And more importantly, NinjaPear is working in a different data paradigm altogether. It is not trying to infer everything from visible front-end code. It can map customer relationships, company details, competitors, employees, and company changes from a website input. That is a different job.</p>
<h2 id="what-redditors-are-saying-about-builtwith">What Redditors are saying about BuiltWith</h2>
<p>I like Reddit because it strips away the sales deck voice.</p>
<p>It also over-indexes on frustration. So read these as texture, not divine truth.</p>
<h3 id="1-lead-quality-workflow-gap">1) Lead quality / workflow gap</h3>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border-left:3px solid #ff4500;padding:12px 16px;margin:16px 0;background:#f8f9fa;border-radius:4px;font-family:-apple-system,sans-serif;">
  <div style="color:#787c7e;font-size:13px;margin-bottom:8px;">
    <strong>u/Certain-Glass4372</strong> on r/coldemail · ↑4
  </div>
  <div style="color:#1a1a1b;font-size:14px;line-height:1.5;">BuiltWith was terrible. Out of 40,000 leads, I ended up being routed through Apollo and only got 400 verified.</div>
  <a href="https://www.reddit.com/r/coldemail/comments/1ojcj5t/ecommerce_leads/?ref=nubela.co" style="color:#787c7e;font-size:12px;">source</a>
</div>

<div style="font-size:12px;color:#6b7280;margin-top:-8px;">Anecdotal user feedback, not universal truth.</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Small sample, sharp lesson: technographics are not contactability.</p>
<h3 id="2-no-contact-data-problem">2) No contact data problem</h3>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border-left:3px solid #ff4500;padding:12px 16px;margin:16px 0;background:#f8f9fa;border-radius:4px;font-family:-apple-system,sans-serif;">
  <div style="color:#787c7e;font-size:13px;margin-bottom:8px;">
    <strong>u/Tasty_Amount6342</strong> on r/coldemail · ↑2
  </div>
  <div style="color:#1a1a1b;font-size:14px;line-height:1.5;">BuiltWith gives you lists of companies using specific tech, but it doesn't give you contact data.</div>
  <a href="https://www.reddit.com/r/coldemail/comments/1ojcj5t/ecommerce_leads/?ref=nubela.co" style="color:#787c7e;font-size:12px;">source</a>
</div>

<div style="font-size:12px;color:#6b7280;margin-top:-8px;">Anecdotal user feedback, not universal truth.</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That’s the exact workflow gap I’d put on the buying committee slide.</p>
<h3 id="3-pricing-skepticism">3) Pricing skepticism</h3>
<p>I couldn’t find a clean Reddit quote with broad consensus and enough context to treat as representative. What I <em>did</em> find was a recurring theme in discussion: people saying BuiltWith is powerful, but the price only works if the use case is highly defined.</p>
<p>Honestly, I agree.</p>
<p>A broad-market team with fuzzy targeting can waste <strong>$495/month</strong> on BuiltWith very efficiently.</p>
<h3 id="4-alternative-comparison">4) Alternative comparison</h3>
<p>I found a useful comparison comment in a Reddit thread about BuiltWith alternatives.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border-left:3px solid #ff4500;padding:12px 16px;margin:16px 0;background:#f8f9fa;border-radius:4px;font-family:-apple-system,sans-serif;">
  <div style="color:#787c7e;font-size:13px;margin-bottom:8px;">
    <strong>u/phb71</strong> on r/coldemail · ↑1
  </div>
  <div style="color:#1a1a1b;font-size:14px;line-height:1.5;">So I looked into alternatives and found a few... (I went for Wappalyzer).</div>
  <a href="https://www.reddit.com/r/coldemail/comments/1h11l6r/builtwith_alternatives/?ref=nubela.co" style="color:#787c7e;font-size:12px;">source</a>
</div>

<div style="font-size:12px;color:#6b7280;margin-top:-8px;">Anecdotal user feedback, not universal truth.</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Not the strongest quote in the world, but it does reflect a common pattern: when buying friction or price friction shows up, people jump to Wappalyzer fast.</p>
<h3 id="5-onboardingpayment-friction">5) Onboarding/payment friction</h3>
<p>Already covered above, but worth repeating: even anecdotal friction matters when you’re trying to get a team running this quarter, not next quarter.</p>
<h2 id="my-hot-takes-on-builtwith">My hot takes on BuiltWith</h2>
<p>I’ll save you the diplomatic version.</p>
<ol>
<li><strong>BuiltWith is a real product. But a lot of teams buy it as a shortcut to pipeline, and that is where they screw themselves.</strong></li>
<li><strong>The entry pricing is not outrageous because of the dollar amount. It’s outrageous when you compare it to how partial the workflow still is.</strong></li>
<li><strong>Technographic targeting is useful. Technographic targeting alone is not a growth strategy.</strong></li>
<li><strong>If I’m the CEO, I only approve this budget when the ICP is brutally specific or the research value is obvious.</strong></li>
<li><strong>Most companies do not have a BuiltWith problem. They have an account selection and timing problem.</strong></li>
</ol>
<p>And one more, because I’m in the mood:</p>
<p><strong>The wrong team can waste $495/month on BuiltWith very efficiently.</strong></p>
<p>And another, because this is the part people keep missing:</p>
<p><strong>BuiltWith, Wappalyzer, and the rest of the scanner crowd are fundamentally looking at front-end evidence. That is a useful slice of reality. It is not the whole company.</strong></p>
<h2 id="faq-for-people-searching-builtwith">FAQ for people searching BuiltWith</h2>
<h3 id="is-builtwith-free">Is BuiltWith free?</h3>
<p>Sort of.</p>
<p>The <strong>free lookup</strong> is available for individual site research. Paid plans begin at around <strong>$295/month</strong> based on public pricing, and there’s also an <strong>Advanced</strong> plan at <strong>$144/year</strong> for detailed individual site lookups.</p>
<h3 id="is-builtwith-accurate">Is BuiltWith accurate?</h3>
<p>Useful enough to drive research and segmentation.</p>
<p>Not magical enough to skip validation on high-value accounts.</p>
<p>If one account actually matters, verify before outreach.</p>
<h3 id="is-builtwith-worth-it">Is BuiltWith worth it?</h3>
<p>Only if your team can monetize technographic segmentation quickly and already understands the rest of the workflow.</p>
<p>If the plan is “buy BuiltWith and figure the rest out later,” no. Absolutely not.</p>
<h3 id="what-is-the-best-builtwith-alternative">What is the best BuiltWith alternative?</h3>
<p>Depends on the job.</p>
<ul>
<li><strong>Wappalyzer</strong> for lighter lookup and cleaner pricing</li>
<li><strong>Ful.io</strong> for some budget-conscious teams that want a simpler lead-intelligence angle</li>
<li><strong>NinjaPear</strong> when the real need is company intelligence, monitoring, customer mapping, relationship data, and timing signals rather than raw front-end tech detection</li>
</ul>
<h2 id="final-verdict-who-should-buy-it-who-should-walk-away">Final verdict: who should buy it, who should walk away</h2>
<p>BuiltWith is not bullshit.</p>
<p>It’s also not a complete answer.</p>
<p>If I’m the CEO and my team can show me a narrow ICP, a real monetization path, and a downstream process for enrichment and outreach, I’ll sign off on it. No drama.</p>
<p>If the pitch is “we’ll buy BuiltWith and figure the rest out later,” absolutely not. That’s how software turns into shelfware and everyone pretends the problem was lead quality.</p>
<p>BuiltWith is good at telling you what a company’s site runs. It is not, by itself, a revenue engine.</p>
<p>And if I really want to be precise: it is part of the <strong>front-end observability</strong> layer of market research. Useful layer. Incomplete layer.</p>
<p>There is a whole separate paradigm beyond front-end tech scraping — customer lists, partner maps, competitor graphs, company monitoring, and relationship intelligence. If that is the actual job to be done, buy for <em>that</em> job instead.</p>
<p>So here’s the next step I’d actually recommend: before you approve budget, force your team to model one campaign on paper. Pick the technologies. Estimate reachable-contact rate. Estimate verification rate. Estimate meetings. Then ask one harder question: <strong>is technographic detection actually the bottleneck, or do you really need customer intelligence and timing signals instead?</strong></p>
<p>If the math still works, fine — buy BuiltWith.</p>
<p>If the math falls apart, you don’t need BuiltWith. You need a better go-to-market thesis.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Person Profile Endpoint (Also: 1000 Users/66K ARR 🎉) ]]></title>
        <description><![CDATA[ I am happy to share a new API endpoint with you today: the Person Profile API Endpoint. The Person Profile Endpoint takes a work email, a name+company, or a role+company combination and returns a full and detailed person profile, including his/her work history, education history, and public ]]></description>
        <link>https://nubela.co/blog/introducing-person-profile-endpoint-also-1000-users-66k-arr/</link>
        <guid isPermaLink="false">69c3ab3bdc900c00015cda91</guid>
        <category><![CDATA[ announcement ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 25 Mar 2026 17:41:20 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/03/Gemini_Generated_Image_ax02n9ax02n9ax02.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I am happy to share a new API endpoint with you today: the <a href="https://nubela.co/employee-api?ref=nubela.co">Person Profile API Endpoint</a>. The Person Profile Endpoint takes a work email, a name+company, or a role+company combination and returns a full and detailed person profile, including his/her work history, education history, and public profile picture (from his/her X profile, if any).</p>
<p>With Patrick Collison's work email, you can get his full professional profile:</p>
<pre><code class="language-bash">curl -G \
  "https://nubela.co/api/v1/employee/profile" \
  --data-urlencode "work_email=patrick@stripe.com" \
  -H "Authorization: Bearer YOUR_API_KEY"
</code></pre>
<p>His professional profile:</p>
<pre><code class="language-json">{
  "id": "a3xK9mP2",
  "full_name": "Patrick Collison",
  "first_name": "Patrick",
  "last_name": "Collison",
  "bio": "Co-founder and CEO of Stripe",
  "profile_pic_url": "https://pbs.twimg.com/...",
  "country": "IE",
  "city": "IELIM",
  "x_handle": "patrickc",
  "x_profile_url": "https://x.com/patrickc",
  "personal_website": "https://patrickcollison.com",
  "work_experience": [
    {
      "role": "Co-founder &amp; CEO",
      "company_name": "Stripe",
      "company_website": "stripe.com",
      "start_date": "2010-01",
      "end_date": null
    },
    {
      "role": "Software Developer",
      "company_name": "Shuppa",
      "company_website": null,
      "start_date": "2007-06",
      "end_date": "2009-12"
    }
  ],
  "education": [
    {
      "major": "B.S. Mathematics",
      "school": "MIT",
      "start_date": "2006-09",
      "end_date": "2009-06"
    }
  ]
}
</code></pre>
<h2 id="how-does-it-work">How does it work?</h2>
<p>First and foremost, we <strong>do not</strong> scrape that particular professional social network site (starting with L). In fact, <strong>nothing</strong> on NinjaPear scrapes that site, nor will we ever do so. <a href="https://nubela.co/blog/goodbye-proxycurl/">We learnt our lesson</a>, so we will not put you or ourselves at any legal risk.</p>
<p>The Person Profile Endpoint searches and aggregates relevant personal professional data from public web sources. Then, we use AI to extract relevant parts of it and semantically structure the data so that you get clean and fresh personal profile data.</p>
<p>In fact, the Person Profile Endpoint goes beyond simple profile enrichment. It performs an AI search to make sure that the person you are searching for is the correct person. For example, you can tell the Person Profile Endpoint to get the profile data of the <strong>CTO</strong> of <strong>Delve</strong> without actually knowing his identity, like this:</p>
<pre><code class="language-bash">curl -G \
    -H "Authorization: Bearer 2718ebe643cf4d9682d64b5889fb43f4" \
    --data-urlencode "employer_website=https://delve.co" \
    --data-urlencode "role=cto" \
    "https://nubela.co/api/v1/employee/profile"
</code></pre>
<p>And because I honestly didn't know who he was, I ran the query with my own API key and this is what I got:</p>
<pre><code class="language-json">{
  "bio": null,
  "city": "LTVIE",
  "country": "LT",
  "education": [
    {
      "end_date": "2016-01",
      "major": "BSc in Artificial Intelligence and Computer Science; Master of Informatics (MInf)",
      "school": "The University of Edinburgh",
      "start_date": "2011-01"
    },
    ...
  ],
  "first_name": "Ingvaras",
  "follower_count": null,
  "following_count": null,
  "full_name": "Ingvaras Merkys",
  "id": "lEPJGBoE",
  "last_name": "Merkys",
  "middle_name": null,
  "personal_website": "ingvaras.com",
  "profile_pic_url": null,
  "slug": "ingvaras-merkys",
  "state": null,
  "work_experience": [
    {
      "company_name": "Delve",
      "company_website": "delve.co",
      "description": "AI-native compliance platform that automates regulatory frameworks like SOC 2 and HIPAA",
      "end_date": null,
      "role": "Technical Co-Founder and CTO",
      "start_date": "2024-02"
    },
    ...
  ],
  "x_handle": null,
  "x_profile_url": null
}
</code></pre>
<p>You can view the full JSON <a href="https://gist.github.com/nubela/e6edd1237d07761ae9ca5e1cedd1fce0?ref=nubela.co">here</a>.</p>
<h2 id="how-well-does-the-person-profile-endpoint-work">How well does the Person Profile Endpoint work?</h2>
<h2 id="match-rate">Match Rate</h2>
<table>
<thead>
<tr>
<th><strong>Input Method</strong></th>
<th><strong>Profiles Found</strong></th>
<th><strong>Accuracy</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Work email</td>
<td>10/10</td>
<td>100%</td>
</tr>
<tr>
<td>First name + Last name + Company</td>
<td>9/10</td>
<td>90%</td>
</tr>
<tr>
<td>Role + Company</td>
<td>7/10</td>
<td>70%</td>
</tr>
</tbody>
</table>
<p>The name+company miss was a very common name at a large company (First_Name Last_Name at Google). The role+company misses were either too-generic roles ("Software Engineer" at Google) or obscure companies with limited public presence.</p>
<h2 id="x-profile-profile-picture-enrichment">X Profile &amp; Profile Picture Enrichment</h2>
<table>
<thead>
<tr>
<th><strong>Input Method</strong></th>
<th><strong>X Handle Found</strong></th>
<th><strong>Profile Picture</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Work email</td>
<td>2/10</td>
<td>2/10 (20%)</td>
</tr>
<tr>
<td>Name + Company</td>
<td>3/10</td>
<td>3/10 (30%)</td>
</tr>
<tr>
<td>Role + Company</td>
<td>4/10</td>
<td>4/10 (40%)</td>
</tr>
</tbody>
</table>
<p>Profile pictures are sourced from X/Twitter profiles. When an X handle is found and validated, the profile picture, bio, and follower counts are populated.</p>
<h2 id="response-time-uncached">Response Time (Uncached)</h2>
<p>Measured from production (nubela.co), all cold-starts (no upstream cache):</p>
<table>
<thead>
<tr>
<th><strong>Percentile</strong></th>
<th><strong>Time</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>p5</td>
<td>17.6s</td>
</tr>
<tr>
<td>p50</td>
<td>23.1s</td>
</tr>
<tr>
<td>p95</td>
<td>31.1s</td>
</tr>
</tbody>
</table>
<p><strong>Raw Data (Work Email Tests):</strong></p>
<p>These are the 10 work email tests specifically (the most consistent dataset): 17.6, 20.5, 20.8, 20.9, 23.7, 24.2, 25.4, 26.4, 27.1, 31.1 seconds.</p>
<h2 id="1036-ninjapear-users-66k-arr">1036 NinjaPear users! 66K ARR!</h2>
<p>In the 54 days since we launched, NinjaPear has grown to <strong>1036 registered users</strong> at the time of writing. On top of that, NinjaPear is now running at an <strong>annualized run rate of around $66,000</strong>! Not bad for a product that is barely two months old. My point is, NinjaPear is <em>here to stay</em> because we are now profitable and growing exponentially.</p>
<h2 id="75-bonus-credits-for-one-last-subscriber">+75% bonus credits for one last subscriber</h2>
<p>One last thing. I never did publicize this, except for a <a href="https://nubela.co/blog/first-10-subscribers/">blog post</a> that I did not share publicly. But for 5 more subscribers, you stand to get up to 75% bonus credits, among other swag. 5 slots have already been taken. Each new subscriber will reduce the bonus by 5%. I can guarantee you that after these 5 subscribers, there will <strong>never</strong> be another promotion. People who know me as the CEO of Proxycurl, which I grew to 10M ARR, will know that I mean it when I say that I do not offer seasonal promotions.</p>
<p>And trust me, you want to upgrade to a subscription. I will be gatekeeping the free APIs behind tiered rate limits based on your subscription plan soon. For users not on a subscription plan, the rate limit of free APIs will be kept to 2 requests/minute. You heard it here first!</p>
<p>As usual, if you have any questions at all, send us an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a> and we'll respond to you personally ASAP, sans AI!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Company Funding and Updates Endpoints ]]></title>
        <description><![CDATA[ I am happy to share today that the Company API just got supercharged with two new endpoints and more data points returned. We are on a consistent and relentless march towards being the ultimate ethically sourced data provider of company and competitive intelligence. Today, I am happy to introduce to ]]></description>
        <link>https://nubela.co/blog/introducing-company-funding-and-updates-endpoints/</link>
        <guid isPermaLink="false">69bba14277821c0001ad7505</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Thu, 19 Mar 2026 15:15:51 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/03/new_company_endpoints.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I am happy to share today that the <a href="https://nubela.co/company-api?ref=nubela.co">Company API</a> just got supercharged with two new endpoints and more data points returned. We are on a consistent and relentless march towards being the ultimate ethically sourced data provider of company and competitive intelligence. Today, I am happy to introduce to you:</p>
<ul>
<li><a href="https://nubela.co/docs/?ref=nubela.co#company-funding-endpoint">Company Funding Endpoint</a> -- Takes a website and returns a company's funding history, amount, and investors.</li>
<li><a href="https://nubela.co/docs/?ref=nubela.co#company-updates-endpoint">Company Updates Endpoint</a> -- Takes a website and returns a company's recent updates from various platforms such as its blog, X/Twitter profile, amongst others.</li>
</ul>
<p>On top of that, we have added:</p>
<ul>
<li><code>follower_count</code> + <code>following_count</code> attributes in the response of the <a href="https://nubela.co/docs/?ref=nubela.co#company-details-endpoint">Company Details Endpoint</a>, as a signal of how popular a company is in the public sphere. This data is obtained from a company's public X/Twitter profile.</li>
</ul>
<h2 id="company-funding-data">Company Funding Data</h2>
<p>As a founder wearing the GTM hat, company funding data matters as a signal of whether a company can afford our services or not. On top of that, VCs and investors can use our company funding data to continually track startups of interest, at scale.</p>
<p>Try it yourself with Stripe's funding data:</p>
<pre><code class="language-bash">curl -G \
  "https://nubela.co/api/v1/company/funding" \
  --data-urlencode "website=https://stripe.com" \
  -H "Authorization: Bearer demo-api-key"
</code></pre>
<h2 id="company-updates-data">Company Updates Data</h2>
<p>This one goes out to all the OpenClaw masters using their clawbots to perform cold GTM outreach. With NinjaPear's Company Updates Data, you can immediately grasp the recent messaging that your target ICP company is pushing out to the public, to which you can adapt your message.</p>
<p>Try it yourself with Stripe's recent updates:</p>
<pre><code class="language-bash">curl -G \
  "https://nubela.co/api/v1/company/updates" \
  --data-urlencode "website=https://stripe.com" \
  -H "Authorization: Bearer demo-api-key"
</code></pre>
<h2 id="data-source">Data Source</h2>
<p>We did not crawl Crunchbase, Pitchbook, or any other private/public funding or news site for this data. This is publicly sourced data that is put out across the web, aggregated and structured. So go forth, and use this data to build your data-driven workflows with confidence.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Competitor API - Real-time Automated Competitor Research ]]></title>
        <description><![CDATA[ I&#39;m happy to share that the Competitor Listing Endpoint, under the Competitor API, is now generally available! The Competitor Listing Endpoint takes a target company&#39;s website and returns a list of competitors by their corresponding website URLs. In other words, we have taken what used to ]]></description>
        <link>https://nubela.co/blog/introducing-competitor-api-real-time-automated-competitor-research/</link>
        <guid isPermaLink="false">69aa4619cce2f30001d6a250</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 06 Mar 2026 11:26:22 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/03/competitor.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I'm happy to share that the <a href="https://nubela.co/docs/?ref=nubela.co#competitor-listing-endpoint">Competitor Listing Endpoint</a>, under the <a href="https://nubela.co/competitors?ref=nubela.co">Competitor API</a>, is now generally available! The Competitor Listing Endpoint takes a target company's website and returns a list of competitors by their corresponding website URLs. In other words, we have taken what used to take hours of research and compressed it into a real-time synchronous API call that takes approximately 30s to complete.</p>
<h2 id="sample-data-and-data-quality">Sample Data and Data Quality</h2>
<p>To be as unbiased as I can be, I decided to run the data sampling and quality test through <a href="https://nubela.co/claude?ref=nubela.co">Claude via NinjaPear's MCP</a>.</p>
<p>This is my prompt:</p>
<blockquote>
<p>Can you help me to sample a couple of companies for the competitor listing endpoint, in a way to review the quality of results (for a blog post)? I want you to try it with companies of different sizes/niches. You can use the competitor listing endpoint on production. Compile your findings in tabular format.</p>
</blockquote>
<h3 id="claudes-response">Claude's Response</h3>
<h4 id="ninjapear-competitor-listing-%E2%80%94-quality-review">NinjaPear Competitor Listing — Quality Review</h4>
<p><strong>Summary</strong></p>
<table>
<thead>
<tr>
<th><strong>Company</strong></th>
<th><strong>Niche</strong></th>
<th><strong>Size</strong></th>
<th><strong># Found</strong></th>
<th><strong>Top Product Overlap Competitors</strong></th>
<th><strong>Quality Notes</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Stripe</strong></td>
<td>Payments</td>
<td>Large</td>
<td>23</td>
<td>PayPal, Adyen, Square, Paddle, Braintree, Airwallex</td>
<td>Excellent. Core payment competitors are spot-on. Keyword overlap section includes banks (Chase, BoA) — tangentially relevant but not direct competitors.</td>
</tr>
<tr>
<td><strong>Notion</strong></td>
<td>Productivity / Docs</td>
<td>Large</td>
<td>16</td>
<td>Coda, ClickUp, Airtable, Slite, Obsidian, AppFlowy</td>
<td>Very strong. Nails both commercial (Coda, Airtable) and open-source alternatives (AppFlowy, Anytype).</td>
</tr>
<tr>
<td><strong>Linear</strong></td>
<td>Issue Tracking</td>
<td>Mid</td>
<td>18</td>
<td>Plane, Shortcut, Huly, Atlassian (Jira), GitHub, ClickUp, Asana</td>
<td>Excellent. Captures the full spectrum from dev-focused (Plane, Shortcut, Huly) to broader PM tools (Asana, Monday).</td>
</tr>
<tr>
<td><strong>Mailchimp</strong></td>
<td>Email Marketing</td>
<td>Large</td>
<td>14</td>
<td>MailerLite, Brevo, Constant Contact, Klaviyo, ActiveCampaign, ConvertKit</td>
<td>Strong. All major email marketing platforms present. Keyword overlap includes adjacent CRM/marketing tools (HubSpot, Salesforce, Hootsuite).</td>
</tr>
<tr>
<td><strong>Figma</strong></td>
<td>Design</td>
<td>Large</td>
<td>18</td>
<td>Penpot, Sketch, UXPin, Adobe, Framer, Axure, Miro</td>
<td>Excellent. Covers prototyping (Axure, ProtoPie), open-source (Penpot), and AI newcomers (Creatie, Visily). Keyword overlap adds Canva/Webflow — reasonable adjacent tools.</td>
</tr>
<tr>
<td><strong>Calendly</strong></td>
<td>Scheduling</td>
<td>Mid</td>
<td>18</td>
<td>Cal.com, TidyCal, SavvyCal, Acuity, Chili Piper, Doodle, Reclaim.ai</td>
<td>Very strong. Hits niche scheduling tools (SavvyCal, TidyCal) and enterprise options (Chili Piper). Zoom/Webex in keyword overlap is sensible.</td>
</tr>
<tr>
<td><strong>Vercel</strong></td>
<td>Cloud / Hosting</td>
<td>Mid</td>
<td>15</td>
<td>Netlify, Cloudflare, Render, DigitalOcean, Fly.io, Railway, AWS, Azure</td>
<td>Excellent. Great mix of direct (Netlify, Render, Railway) and broader cloud (AWS, Azure). Even picks up self-hosted alternatives (Coolify, Dokploy).</td>
</tr>
</tbody>
</table>
<hr>
<p><strong>Overall Assessment</strong></p>
<table>
<thead>
<tr>
<th><strong>Dimension</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Notes</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Precision</strong></td>
<td>High</td>
<td>Product overlap results are consistently relevant — very few false positives.</td>
</tr>
<tr>
<td><strong>Recall</strong></td>
<td>High</td>
<td>Covers major known competitors plus lesser-known/niche alternatives that add value.</td>
</tr>
<tr>
<td><strong>Categorization</strong></td>
<td>Useful</td>
<td>The "product overlap" vs "organic keyword overlap" distinction works well. Product overlap competitors are consistently stronger matches.</td>
</tr>
<tr>
<td><strong>Niche discovery</strong></td>
<td>Strong</td>
<td>Picks up emerging/small competitors (Huly, Dokploy, Coolify, Creatie.ai) that most databases miss.</td>
</tr>
<tr>
<td><strong>Edge cases</strong></td>
<td>Minor</td>
<td>Some keyword-overlap results are tangential (e.g., banks for Stripe, Dribbble for Figma), but the separation makes this easy to filter.</td>
</tr>
</tbody>
</table>
<p><strong>Standout Observations</strong></p>
<ol>
<li><strong>Small/emerging competitors surfaced well</strong> — Huly.io, Plane.so, Dokploy, Coolify, and Creatie.ai are all real but lesser-known alternatives that demonstrate depth beyond just listing the obvious players.</li>
<li><strong>Two-signal approach works</strong> — "Product overlap" competitors are consistently the most relevant, while "keyword overlap" adds broader context without polluting the core list.</li>
<li><strong>Cross-niche accuracy</strong> — Results are strong whether the company is in payments, design, email marketing, or dev tools. No niche bias detected.</li>
<li><strong>Count range</strong> — 14–23 competitors per query gives enough breadth without overwhelming noise.</li>
</ol>
<h2 id="use-cases">Use-cases</h2>
<p>As an entrepreneur, I honestly believe in dog-fooding. So I'll start with why the Competitor Listing Endpoint is going to be very useful for me.</p>
<ol>
<li>I'm going to be able to find all the competitors of my ideal customers that signed up on NinjaPear and prod them into using NinjaPear. To be specific, the Competitor Listing Endpoint makes this process effortless.</li>
<li>Better onboarding experience on NinjaPear. Imagine: I'll be able to tell every new user who logs into NinjaPear who their competitors are and ask if they want to generate a report of their competitors' customers.</li>
</ol>
<p>And that's just off the top of my head. For you, the use-cases are limitless.</p>
<p>You can:</p>
<ol>
<li>Quickly identify a prospect's competitors before a call.</li>
<li>Use <a href="https://nubela.co/company-monitor?ref=nubela.co">NinjaPear's Company Monitor</a> and monitor your competitors for competitive intelligence.</li>
</ol>
<h2 id="pricing">Pricing</h2>
<p>The Competitor API will cost <code>2</code> credits per competitor returned, with a minimum of <code>5</code> credits charged per API call.</p>
<h2 id="try-it-out-today">Try it out today!</h2>
<p>Sniff and snuff out your competitors today. Start by identifying an exhaustive list of them. Try it out now at no credit cost:</p>
<pre><code>curl -X GET \
  "https://nubela.co/api/v1/competitor/listing?website=stripe.com" \
  -H "Authorization: Bearer demo-api-key"
</code></pre>
<p>Questions? Send us an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Company Monitor and Updates API ]]></title>
        <description><![CDATA[ I&#39;m happy to share that the Company Monitor and the Updates API which powers the Company Monitor are now generally available on NinjaPear. Company Monitor (and the Updates API) takes a set of websites, tracks them, and provides you with updates from their blog posts, their social media ]]></description>
        <link>https://nubela.co/blog/introducing-company-monitor/</link>
        <guid isPermaLink="false">69a656337c54f70001878d62</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 03 Mar 2026 11:46:26 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/03/updates-1.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I'm happy to share that the <a href="https://nubela.co/company-monitor?utm_source=blog" rel="noreferrer">Company Monitor</a> and the <a href="https://nubela.co/updates?utm_source=blog" rel="noreferrer">Updates API</a> which powers the Company Monitor are now generally available on NinjaPear. Company Monitor (and the Updates API) takes a set of websites, tracks them, and provides you with <strong>updates</strong> from their blog posts, their social media (X/Twitter) posts, as well as any meaningful (competitive intelligence) changes on their website.</p><h2 id="what-does-the-company-monitor-look-like-here-is-the-ui-vs-rss-view">What does the Company Monitor look like? Here is the UI vs RSS view</h2>
<!--kg-card-begin: html-->
<iframe src="https://nubela.co/widget/monitor-demo" width="100%" height="700px" frameborder="0" style="border: none; border-radius: 16px; max-width: 672px; margin: 0 auto; display: block;"></iframe>
<!--kg-card-end: html-->
<h2 id="company-monitor">Company Monitor</h2>
<p>Company Monitor is <strong>not</strong> just a website monitoring tool like Visualping or Distill.io. Yes, it monitors websites, but the product goes far beyond—blog posts, social media posts, etc. Company Monitor is available on NinjaPear's dashboard as a tool for professionals.</p>
<p>You will be the first to know every move that a company makes, whether it is a blog post, updates to a website, or a post made by the company on social media. Simply put, Company Monitor offers you <strong>company change</strong> data, another facet of the overarching myriad of competitive intelligence data that NinjaPear provides.</p>
<p>Unlike most other website monitors such as Visualping, Company Monitor does not <em>just</em> monitor websites. The product intention here is to provide you with competitive intelligence data on moves that your target business will make—not just on their website, but beyond it as well. Today, we launch with monitoring blogs, X posts, as well as changes made on the website. Moving forward, I expect to include all kinds of updates such as news, PR releases, rumors, reviews, etc.</p>
<p>While data is important, ingestion of the data is equally important. We put in significant work to make sure:</p>
<ol>
<li>You do not ingest negligible rubbish.</li>
<li>It just works. There will be no configuration hell.</li>
<li>Changes are easily understood.</li>
</ol>
<p>Under the hood, Company Monitor filters for meaningful changes with AI, summarizes the change in simple words, tells you why it is important, and then displays the changes in a timeline format.</p>
<p>Company Monitor just works.</p>
<h2 id="updates-api">Updates API</h2>
<p>The Updates API is the underlying engine of Company Monitor. Every benefit that Company Monitor offers, the Updates API does as well. You make a call to the API to create a feed, and in return, you get an RSS feed which you can poll as often as you like for company changes. See API documentation for the Updates API <a href="https://nubela.co/docs/?ref=nubela.co#updates-api">here</a>.</p>
<p>At a high level, the core concepts of the Updates API revolve around <em>feeds</em> and <em>targets</em>. Feeds are RSS feeds. Targets are businesses denoted by their website URLs. And because it is an RSS feed, you can consume the feed through your favorite RSS reader such as Feedly or Slack.</p>
<h2 id="pricing">Pricing</h2>
<p>This is how much it will cost to use Company Monitor or the Updates API for various use cases.</p>
<table>
<thead>
<tr>
<th><strong>Scenario</strong></th>
<th><strong>Targets</strong></th>
<th><strong>Frequency</strong></th>
<th><strong>Credits/month</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>VC tracking 20 portfolio companies</td>
<td>20</td>
<td>Weekly</td>
<td>~<strong>346</strong> credits (3 one-time + 20 × 4 × 4.3 weeks)</td>
</tr>
<tr>
<td>Startup monitoring 10 competitors</td>
<td>10</td>
<td>Daily</td>
<td>~<strong>1,203</strong> credits (3 one-time + 10 × 4 × 30 days)</td>
</tr>
<tr>
<td>Sales team watching 5 prospect accounts (blog + X only, no website)</td>
<td>5</td>
<td>Daily</td>
<td>~<strong>453</strong> credits (3 one-time + 5 × 3 × 30 days)</td>
</tr>
</tbody>
</table>
<p>For further breakdown, see <a href="https://nubela.co/docs/?ref=nubela.co#pricing">Updates API pricing</a>.</p>
<h2 id="structured-data-rss-feeds-api-first-social-media-monitoring-included-no-per-page-limits">Structured data (RSS feeds), API-first, social media monitoring included, no per-page limits</h2>
<p>What are you waiting for? NinjaPear's Company Monitor just works. Give it a try now by logging into <a href="https://nubela.co/dashboard/monitor/?ref=nubela.co">NinjaPear's dashboard</a> and add your competitors' websites to track them!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ NinjaPear for Claude, Company Details &amp; Size API ]]></title>
        <description><![CDATA[ Happy Lunar New Year!



NinjaPear in Claude


I&#39;m happy to share today that you can now use NinjaPear data entirely in Claude. Not just Claude Chat, but Claude Code, Cowork, PowerPoint, Excel—everything B2B data would be helpful for—so you can do things like:


 1. Ask &quot; ]]></description>
        <link>https://nubela.co/blog/ninjapear-for-claude-and-new-api-endpoints/</link>
        <guid isPermaLink="false">6996e7a41209920001dd866a</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Thu, 19 Feb 2026 18:39:46 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/02/claude.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>Happy Lunar New Year!</p>
<h2 id="ninjapear-in-claude">NinjaPear in Claude</h2>
<p>I'm happy to share today that you can now use NinjaPear data entirely in Claude. Not just Claude Chat, but Claude Code, Cowork, PowerPoint, Excel—everything B2B data would be helpful for—so you can do things like:</p>
<ol>
<li>Ask "Who are Shopify's customers?" or "How many employees does Anthropic have?"</li>
<li>Use Claude Code and...
<ul>
<li>add company logos to user accounts on your dashboard using NinjaPear's Logo API.</li>
<li>automatically enrich your CRM with company details for all accounts.</li>
<li>integrate email validation into your sign-up flow.</li>
</ul>
</li>
<li>Use Claude Cowork and...
<ul>
<li>research a company before a meeting.</li>
<li>perform a competitive analysis: Stripe vs. Adyen vs. Square.</li>
</ul>
</li>
<li>Use Claude for Excel and...
<ul>
<li>build a lead list from Salesforce's customers.</li>
<li>build an investor overlap matrix between your portfolio companies.</li>
</ul>
</li>
<li>Use Claude for PowerPoint and...
<ul>
<li>build a competitive battle card slide.</li>
<li>build a company overview slide for Stripe.</li>
</ul>
</li>
</ol>
<p>Takes just 2 minutes. Go to <a href="https://nubela.co/dashboard/ai-integrations/claude?ref=nubela.co">NinjaPear's dashboard for Claude</a> and get started.</p>
<h2 id="introducing-company-details-endpoint-and-employee-count-endpoint">Introducing Company Details Endpoint and Employee Count Endpoint</h2>
<p>On top of that, I'm also happy to share two new API endpoints:</p>
<ol>
<li><a href="https://nubela.co/docs/?ref=nubela.co#company-details-endpoint">Company Details Endpoint</a></li>
<li><a href="https://nubela.co/docs/?ref=nubela.co#employee-count-endpoint">Employee Count Endpoint</a></li>
</ol>
<p>We extract this information from the public web and we do <strong>not</strong> crawl any social networks. In fact, our data is a lot richer than standard professional social network profiles. For example, we include data such as revenue of public companies by crawling SEC filings (Submissions, CXBRL, and GLEIF/LEI data).</p>
<p>These new API endpoints are already live and are included in our <a href="https://nubela.co/docs/?ref=nubela.co#client-libraries">PY/JS libraries</a>.</p>
<p>I believe these API endpoints will be extremely useful in helping you enrich customer companies and helping to score them further, particularly with our integration with Claude.</p>
<hr>
<p>We've barely started. We have our heads down and we have TWO gigantic paradigms of data in the pipeline.</p>
<p>The first will be <strong>Competitor data</strong>, through which you will be able to identify competitors for your business, or any other business really.</p>
<p>The second data will be <strong>Product data</strong>. And this is a huge one. We are going to map and track products (and services) created by every company in the world. And instead of dumping them into a fixed product taxonomy, we will map products on two planes of matrices: first by product type, and second by product features.</p>
<p>So you can not only find a "CRM" (if you're seeking one), but you can also zoom in to find which CRM is <strong>free</strong> and is <strong>well integrated with Gmail</strong>. And just imagine doing this for every company in the world.</p>
<p>We're building the data pipeline to map every business in the world by customers, products, and competitors. The best source of data for competitive intelligence and market research.</p>
<p>If you have not subscribed to an account yet, do it now. I assure you that when everything is live, our prices will go up. Besides, I have only <a href="https://nubela.co/blog/first-10-subscribers/">10 pairs of NinjaPear socks up for grabs</a>. It's not our <a href="https://nubela.co/blog/goodbye-proxycurl/">first rodeo</a> building a company; you know we always deliver :)</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Better Customer Data, JS/PY SDKs, etc. ]]></title>
        <description><![CDATA[ Improved Customer Listing Endpoint


You want better customer results and we have them. I spent the weekend dramatically improving the quality of the results of the Customer Listing Endpoint. There were two main problems with the customer data: there was too much noise, including some customers that are no longer ]]></description>
        <link>https://nubela.co/blog/better-customer-data-js-py-sdks-etc/</link>
        <guid isPermaLink="false">69899d50c363370001f11912</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 09 Feb 2026 16:42:36 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/02/polish.jpg" medium="image"/>
        <content:encoded><![CDATA[ <h2 id="improved-customer-listing-endpoint">Improved Customer Listing Endpoint</h2>
<p>You want better customer results and we have them. I spent the weekend dramatically improving the quality of the results of the <a href="https://nubela.co/docs?ref=nubela.co#customer-listing-endpoint">Customer Listing Endpoint</a>. There were two main problems with the customer data: there was too much noise, including some customers that are no longer alive.</p>
<p>To sort out the quality customers from the noise, I have now introduced two more categories of results to further categorize actual customers:</p>
<ul>
<li>Investors - A list of companies that are possible investors (VC firms, PE funds, angel networks) of the target company.</li>
<li>Partners &amp; Platforms - A list of companies that are partners, platforms, or service providers that the target company uses or integrates with (tech stack, media, agencies).</li>
<li>Customers (the good stuff) - A list of companies that are probable customers of the target company—entities that pay for the target's product/service.</li>
</ul>
<p>To further improve the quality of data, we will now filter out dead companies/websites and non-relevant companies with the <code>quality_filter</code> parameter, which defaults to <code>true</code>. So by default, you will get dramatically better results now.</p>
<p>See the <a href="https://nubela.co/shared/list/8c48c0a8b18a4899bbe85ea22efdf53b?ref=nubela.co">customer results</a> for <code>se-fi.com</code>, StoneEagle, a leading software provider for the automotive industry. Their ideal customer profile (ICP) would be high-volume stakeholders within the retail automotive ecosystem, and you can see that most of the customers reflect that.</p>
<p>We also know that Battery Ventures is their VC, and it is rightly listed under the "Investor" tab.</p>
<h2 id="introducing-ninjapears-python-and-javascript-sdks">Introducing NinjaPear's Python and JavaScript SDKs</h2>
<p>I'm also happy to announce that we have added the Python and JavaScript SDK libraries on <a href="https://pypi.org/project/ninjapear/?ref=nubela.co">PyPi</a> and <a href="https://www.npmjs.com/package/ninjapear?ref=nubela.co">NPM</a> respectively. All the sample code in our API docs is updated to reflect the use of these specific SDKs.</p>
<h2 id="logo-api">Logo API</h2>
<p>There is also the Logo API, which was <a href="https://nubela.co/blog/introducing-logo-api-the-definitive-and-free-alternative-to-clearbits-deprecated-logo-api/">launched last week</a>.</p>
<h2 id="customer-data-explorer">Customer Data Explorer</h2>
<p>Then there is the Customer Data Explorer, which was also <a href="https://nubela.co/blog/introducing-customer-data-explorer/">launched last week</a>. I'm also happy to add that we added a public sharing option so you can share results that you have pulled via NinjaPear with your colleagues.</p>
<h2 id="one-more-thing">One more thing</h2>
<p><a href="https://nubela.co/blog/first-10-subscribers/">We launched a one-time subscription promo</a> for which I'm bound to lose money on. It is only applicable for the first 10 subscriptions. Aside from bonus credits, you will get a dedicated blog post on your company with backlinks, a newsletter push to 40K subscribers, and socks! Who doesn't like NinjaPear socks?</p>
<p>While s<s>t</s>ocks last!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ First 10 Subscriptions Only - 100% extra credits, blog post + newsletter feature, swag, my number ]]></title>
        <description><![CDATA[ I am going to lose money and sleep over this. For the first 10 subscribers of NinjaPear, I will give you these extras on top of what you are getting out of the subscription:


 1. 100% extra credits on top of your plan&#39;s credits (95% for the 2nd ]]></description>
        <link>https://nubela.co/blog/first-10-subscribers/</link>
        <guid isPermaLink="false">69896cc1c363370001f11907</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 09 Feb 2026 13:21:37 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/02/sub10.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I am going to lose money and sleep over this. For the first 10 subscribers of NinjaPear, I will give you these extras on top of what you are getting out of the subscription:</p>
<ol>
<li>100% extra credits on top of your plan's credits (95% for the 2nd subscriber, 90% for the 3rd, and so on).</li>
<li>A blog post with backlinks featuring you or your business.</li>
<li>A newsletter feature, showcasing you or your business, sent to my 40K subscribers composed of ex-Proxycurl and NinjaPear customers.</li>
<li>Limited Edition NinjaPear Socks! (Only 11 pairs will be made, and 1 of them is for me).</li>
<li>My personal number, so you can text me anytime for support or just for a chat.</li>
</ol>
<p>I am launching this one-time promotion to kickstart product viability.</p>
<h2 id="but-steven-you-only-have-a-customer-api">But Steven, You Only Have a Customer API?</h2>
<p>No, these new APIs and their corresponding endpoints are all coming:</p>
<ul>
<li>Contact API
<ul>
<li>Phone Number Lookup Endpoint</li>
<li>Email Lookup Endpoint</li>
</ul>
</li>
<li>Company API
<ul>
<li>Company Profile Endpoint</li>
<li>Employee Count Endpoint</li>
<li>Posts Endpoint</li>
</ul>
</li>
</ul>
<p>Your credits can be used for these endpoints. And unfortunately, my 5th metatarsal bone still remains fractured, which means productivity is at an all-time high.</p>
<p>And you know what? <strong>We are not using any data from the big L professional social network</strong>. Only publicly sourced data, without any of the legal risks. In fact, NinjaPear will <strong>never</strong> use any data from that professional social netwrk data. I can promise you that, and I will back it up with regular audits when we make enough money.</p>
<h2 id="making-sure-ninjapear-has-legs-wings-for-the-next-10-years">Making sure NinjaPear has <s>legs</s> wings for the next 10 years</h2>
<p>NinjaPear is a 10-year project. The best way to guarantee the success of NinjaPear and its long-term viability is to NOT raise venture capital and to be profitable right from the get-go. It is in your interest to see NinjaPear succeed because, if you are like me, you want a serious alternative to B2B data beyond that big L professional social network. It is my vision to build NinjaPear to be the biggest first-party B2B data platform.</p>
<p>I am going to tell you how I intend to do it. There are three wings of the product that NinjaPear needs to succeed at:</p>
<ol>
<li>A platform for businesses and professionals to provide first-hand updates because it benefits them.</li>
<li>A platform for businesses and professionals to manage how their data is used commercially.</li>
<li>A monetization platform for B2B data.</li>
</ol>
<h4 id="first-hand-updates">First-hand Updates</h4>
<p>Businesses set up a Google Business Profile so that they are visible on Google Maps and search, for which they manage their public reviews in return for traffic. NinjaPear seeks to flesh out a platform for businesses and professionals to provide first-hand updates because it serves their interests.</p>
<h4 id="data-management-and-privacy">Data Management and Privacy</h4>
<p>When you provide your data to NinjaPear, you will get insight as to who is requesting your data. You also get to decide what data you want to be public or private.</p>
<h4 id="api">API</h4>
<p>Lastly, NinjaPear's business model is centered on being a responsible B2B data broker, working <em>only</em> with publicly sourced data.</p>
<hr>
<p>Your early support will go a long way. This is not my first rodeo. I bootstrapped Proxycurl to 10M ARR in 4 years. I'm ready to go big again.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Logo API - The Definitive AND Free Alternative to Clearbit&#x27;s Deprecated Logo API ]]></title>
        <description><![CDATA[ I just found out yesterday that Clearbit shut down their Logo API last year. I&#39;m happy to introduce NinjaPear&#39;s Logo API, a free alternative to Clearbit&#39;s Logo API. NinjaPear&#39;s Logo API is available today.


I also found out just yesterday that Amit ]]></description>
        <link>https://nubela.co/blog/introducing-logo-api-the-definitive-and-free-alternative-to-clearbits-deprecated-logo-api/</link>
        <guid isPermaLink="false">698418a5c363370001f118f4</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Thu, 05 Feb 2026 12:20:01 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/02/logo_api.jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>I just found out yesterday that Clearbit shut down their Logo API last year. I'm happy to introduce <a href="https://nubela.co/logo?ref=nubela.co">NinjaPear's Logo API</a>, a free alternative to Clearbit's Logo API. NinjaPear's Logo API is available today.</p>
<p>I also found out just yesterday that Amit Vasudev—one of the cofounders of Clearbit (which was later acquired by HubSpot) and also a VC—is clearly very rich and has relaunched Clearbit's Logo API as logo.dev, and started charging money for it. Logos as a service, for up to $1,800/year. And you only get 5M requests/mo on their most expensive plan. Just think about that.</p>
<p>Anyways, NinjaPear's Logo API is free, and you get 12.9M requests a month. I hope that says enough.</p>
<p>Don't take my word for it. Try it yourself:</p>
<pre><code class="language-bash">curl -H \
 "Authorization: Bearer demo-api-key" "https://nubela.co/api/v1/company/logo?website=stripe.com" --output \
 stripe.png
</code></pre>
<p>What are you waiting for? Sign up and grandfather yourself into this free pricing tier for Logo API before NinjaPear begins seeing real load, at which point I might actually change my mind :)</p>
<p>Questions about Logo API? Send an email to <a href="mailto:hello@nubela.co">hello@nubela.co</a> and I'll make sure to respond to you personally!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Customer Data Explorer (Bonus: Proxycurl&#x27;s Customer Base Download) ]]></title>
        <description><![CDATA[ It was my birthday just yesterday, but I have a gift for you today. I am going to gift you a list of Proxycurl&#39;s paying customer list. Interested? Read on.

I&#39;m happy to share that you can now explore Customer Data right in the dashboard without ]]></description>
        <link>https://nubela.co/blog/introducing-customer-data-explorer/</link>
        <guid isPermaLink="false">6982f4dafa7b8500013ec87a</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 04 Feb 2026 16:47:40 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/02/Gemini_Generated_Image_pch55lpch55lpch5-1.png" medium="image"/>
        <content:encoded><![CDATA[ <p>It was my birthday just yesterday, but I have a gift for you today. I am going to gift you a list of Proxycurl's paying customer list. Interested? Read on.</p><p>I'm happy to share that you can now <a href="https://nubela.co/dashboard/customers/?ref=nubela.co" rel="noreferrer">explore Customer Data right in the dashboard</a> without making a <code>curl</code> command or writing code to make API requests.</p><p>Yes, these are the customers of any target B2B companies, that you can now retrieve via NinjaPear.</p><p>How the <em>Customer Data Explorer</em> looks like:</p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/02/Screenshot-2026-02-04-at-3.13.48-PM.png" class="kg-image" alt="" loading="lazy" width="2998" height="2400"></figure><p>Effectively, NinjaPear will now be your ultimate sales intelligence tool to steal your competitors' customers. Client data that was previously secret, now made public through NinjaPear's proprietary inferencing relationships between companies on the public web.</p><p>Give it a <a href="https://nubela.co/dashboard/customers/?ref=nubela.co">try</a> today!</p><p>I have also leaked out Proxycurl's paying customer list <a href="https://nubela.co/dashboard/customers/proxycurl.com?ref=nubela.co">here</a>. It is free and will cost no credits. Steal Proxycurl customers today!</p><p>Questions? Feel free to send me an email to <a href="mailto:hello@nubela.co">hello@nubela.co</a> and you will be sure that I will respond to you personally.</p><p>Signing off, your favourite Lazy CEO.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ FAQ: But the customer data does not look correct ]]></title>
        <description><![CDATA[ A customer emailed us with the following query:





Hi Steven,


Glad to hear that you are back!


I am a bit confused about this customer API listing service. For a real business case I would be interested in getting the customers of this software company: https://www.otys.com/en/ ]]></description>
        <link>https://nubela.co/blog/faq-but-the-customer-data-does-not-look-correct/</link>
        <guid isPermaLink="false">697e9bc60490c40001febdd1</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Sun, 01 Feb 2026 08:23:08 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>A customer emailed us with the following query:</p>
<blockquote>
<p>Hi Steven,</p>
<p>Glad to hear that you are back!</p>
<p>I am a bit confused about this customer API listing service. For a real business case I would be interested in getting the customers of this software company: <a href="https://www.otys.com/en/?ref=nubela.co">https://www.otys.com/en/</a></p>
<p>They have a CRM for staffing agencies.</p>
<p>In the first 20 results it only returned similar software (like 'Recruit Robin' or '<a href="https://corporate.jobrapido.com/?ref=nubela.co">https://corporate.jobrapido.com/</a>'), non existing sites ('<a href="https://www.wordofmedia.nl/?ref=nubela.co">https://www.wordofmedia.nl/</a>', '<a href="https://www.clarox.nl/?ref=nubela.co">https://www.clarox.nl/</a>', '<a href="https://www.jobrokket.nl/?ref=nubela.co">https://www.jobrokket.nl/</a>') and a link to some legal thing '<a href="https://gdprprivacypolicy.org/?ref=nubela.co">https://gdprprivacypolicy.org/</a>'</p>
<p>I was expecting it to return a list of staffing agencies that have shown to be interacting with OTYS, but the current results seem to be.a total mistake. I understand the tool is still in development, and I hope that this example helps in that development. Would love to be notified if you got it working for this use case, then I would be interested in becoming a bulk customer!</p>
<p>Best regards,</p>
<p>Lodewijk</p>
</blockquote>
<p>My response:</p>
<blockquote>
<p>Hey Lodewijk,</p>
<p>Are you sure those aren’t customers of Otys? I’m saying this because the results of Proxycurl (my previous company) aren’t obvious either, even though it is 100% correct.</p>
<p>Here’s how you get Proxycurl’s results:</p>
<pre><code>curl -X GET \
"https://nubela.co/api/v1/customer/listing?website=https%3A%2F%2Fproxycurl.com" \
-H "Authorization: Bearer demo-api-key"
</code></pre>
<p>And you get companies in the MAG7, which a few of them were a paying customer of mine. A lot of similar companies such as fullenrich.com, which were resellers of our data. And one more that says “Kellogg School of Management”, because the university was a customer of ours!</p>
<p>My point is, just because the data does not look conventionally correct according to your hypothesis, does not mean it is wrong. Which is why I recommend running it on your own company first, and see if the data is correct. Then you know how well it works for other companies.</p>
<p>Hope this clarifies!</p>
</blockquote>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing NinjaPear (2026) - Customer Listing API ]]></title>
        <description><![CDATA[ Happy 2026! I broke a bone in my right foot (5th metatarsal) three weeks ago, and being forcefully grounded has made me incredibly productive. As such, I’m happy to announce the new NinjaPear!


I am launching NinjaPear with our first flagship API endpoint: the Customer Listing Endpoint.


It actually ]]></description>
        <link>https://nubela.co/blog/introducing-ninjapear-2026-customer-listing-api/</link>
        <guid isPermaLink="false">697c254f0490c40001febdb8</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 30 Jan 2026 11:38:32 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/01/I-need-a-blog-post-cover-image-which-is-announcing-NinjaPear--a-new-product-with-a-Customer-Listing-API-Endpoint-which-lets-you-pull-a-customer-list-of-any-target-company.-Attached-image-is-the-company-logo_mascot..jpg" medium="image"/>
        <content:encoded><![CDATA[ <p>Happy 2026! I broke a bone in my right foot (5th metatarsal) three weeks ago, and being forcefully grounded has made me incredibly productive. As such, I’m happy to announce the new <strong>NinjaPear</strong>!</p>
<p>I am launching NinjaPear with our first flagship API endpoint: the <a href="https://nubela.co/docs/?ref=nubela.co#customer-api">Customer Listing Endpoint</a>.</p>
<p>It actually works quite well, but don’t take my word for it. Run a query and see for yourself:</p>
<pre><code class="language-bash">curl -X GET \
  "https://nubela.co/api/v1/customer/listing?website=https%3A%2F%2Fproxycurl.com" \
  -H "Authorization: Bearer demo-api-key"
</code></pre>
<p>Most of these results are paying Proxycurl customers. For those that aren't, they are registered users who have engaged with Proxycurl’s sales team in the past.</p>
<h2 id="so-how-does-ninjapear%E2%80%99s-customer-listing-endpoint-work">So, how does NinjaPear’s Customer Listing Endpoint work?</h2>
<p>You know I can’t tell you exactly <em>how</em> it works, but I can tell you what we are <strong>not</strong> doing to get our data:</p>
<ul>
<li>We are <strong>not</strong> scraping any professional social media platforms (you know the big one) or business data sites.</li>
<li>We are <strong>not</strong> scraping anything behind login walls.</li>
<li>In fact, we aren't performing much scraping at all on our end.</li>
<li>Scraping is <strong>not</strong> NinjaPear’s core business.</li>
</ul>
<p>What I can tell you is that NinjaPear is a data company made possible by LLMs. If you’re a long-time follower, you might know that Proxycurl had a <a href="https://nubela.co/proxycurl/docs.html?ref=nubela.co#customer-api-experimental">Customer Listing Endpoint</a> as well. However, NinjaPear’s rendition offers fresher, richer data and does not require heavy scraping infrastructure.</p>
<h2 id="what-i-am-really-building-with-ninjapear">What I am really building with NinjaPear</h2>
<p>With NinjaPear, my intention is to build a new data platform where professionals and companies are incentivized to maintain their professional presence for <strong>monetary</strong> reasons—rather than just for "presence" or flexing credentials (like how fast a company is growing, job titles, or current employers). I will share more on how we will accomplish this soon.</p>
<p>The Customer API is my way of getting back into the data game while I build out the monetization piece. My vision is for NinjaPear to become the "Yellow Pages" for the post-AI world.</p>
<p>I have several ideas I intend to test. You will know NinjaPear has succeeded when you hear your friends talk about maintaining their own profiles on the platform. NinjaPear will be a first-party B2B data platform where we own our data directly from the source.</p>
<h2 id="what-happened-to-the-live-chat-v1-product">What happened to the Live Chat (v1) product?</h2>
<p>About three months ago, I introduced <a href="https://nubela.co/blog/introducing-ninjapear/">NinjaPear (v1)</a>, which was a completely different product focused on AI live chat. I never made a formal announcement, choosing instead to let time and natural SEO work their magic.</p>
<p>Over those three months, it grew to 163 registered users without any active marketing—but <strong>not one</strong> user actually integrated the live chat service. So, I decided to pivot back to data.</p>
<p>I’ve been playing around with AI extensively, and it’s a brand-new world. Features alone won't sell a service anymore when they can be so easily "vibe-coded" away. In this post-AI world, it is proprietary secrets and data that make the difference.</p>
<p>I’m good at data, and I know this space inside and out. Besides, my burn rate is negligible, and I’m building this for the long haul. So strap in and give the Customer Listing Endpoint a try. Go ahead—steal your competitor’s customers with NinjaPear.</p>
<p><strong>I’m back.</strong></p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The CEO&#x27;s Ultimate Guide to Knowledge Base Software (Demo, UI Preview, Reviews, Pricing) ]]></title>
        <description><![CDATA[ As a CEO who&#39;s bootstrapped and sold two companies, I know a solid knowledge base is key to growth. This isn&#39;t an AI-generated list. It&#39;s my operationally-savvy guide to the best knowledge base software, based on personally testing every major platform. Get real-world demos, pricing, and reviews. ]]></description>
        <link>https://nubela.co/blog/ultimate-guide-to-knowledge-base-software/</link>
        <guid isPermaLink="false">68faf2abc2bb4600014654d9</guid>
        <category><![CDATA[ knowledge base software ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 27 Oct 2025 09:09:30 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/10/blogpostfeature.jpg" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<style>
    .kb-widget-container {
        width: 100% !important;
        max-width: 1000px !important;
        height: 700px !important;
        margin: 0 auto !important;
        background: #1a1d23 !important;
        border-radius: 8px !important;
        box-shadow: 0 4px 16px rgba(0,0,0,0.3) !important;
        padding: 28px !important;
        display: flex !important;
        flex-direction: column !important;
        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif !important;
    }

    .kb-widget-container .kb-widget-header {
        margin-bottom: 20px !important;
    }

    .kb-widget-container .kb-widget-title {
        font-size: 22px !important;
        font-weight: 700 !important;
        color: #ffffff !important;
        margin-bottom: 6px !important;
        line-height: 1.3 !important;
    }

    .kb-widget-container .kb-widget-subtitle {
        font-size: 13px !important;
        color: #9ca3af !important;
        line-height: 1.4 !important;
    }

    .kb-widget-container .kb-filter-section {
        background: #15171A !important;
        padding: 16px !important;
        border-radius: 8px !important;
        margin-bottom: 20px !important;
        border: 1px solid #2d3139 !important;
    }

    .kb-widget-container .kb-filter-title {
        font-size: 14px !important;
        font-weight: 600 !important;
        color: #e5e7eb !important;
        margin-bottom: 12px !important;
    }

    .kb-widget-container .kb-filter-options {
        display: flex !important;
        flex-wrap: wrap !important;
        gap: 10px !important;
    }

    .kb-widget-container .kb-filter-button {
        padding: 8px 16px !important;
        border-radius: 8px !important;
        border: 2px solid #4b5563 !important;
        background: #2d3139 !important;
        color: #9ca3af !important;
        font-size: 13px !important;
        font-weight: 500 !important;
        cursor: pointer !important;
        transition: all 0.2s ease !important;
        user-select: none !important;
        box-shadow: 0 2px 4px rgba(0,0,0,0.2) !important;
    }

    .kb-widget-container .kb-filter-button:hover {
        border-color: #6b7280 !important;
        background: #353945 !important;
        color: #d1d5db !important;
        transform: translateY(-1px) !important;
        box-shadow: 0 3px 6px rgba(0,0,0,0.25) !important;
    }

    .kb-widget-container .kb-filter-button.active {
        background: #7c3aed !important;
        color: #ffffff !important;
        border-color: #7c3aed !important;
        box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.3), inset 0 1px 2px rgba(0,0,0,0.1) !important;
        transform: translateY(0) !important;
        font-weight: 600 !important;
    }

    .kb-widget-container .kb-filter-button.active:hover {
        background: #8b5cf6 !important;
        border-color: #8b5cf6 !important;
        box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.4), inset 0 1px 2px rgba(0,0,0,0.1) !important;
    }

    .kb-widget-container .kb-services-section {
        flex: 1 !important;
        overflow-y: auto !important;
        padding-right: 8px !important;
        position: relative !important;
    }

    .kb-widget-container .kb-service-item {
        display: flex !important;
        align-items: center !important;
        justify-content: space-between !important;
        padding: 14px 18px !important;
        border: 1px solid #2d3139 !important;
        border-radius: 8px !important;
        margin-bottom: 10px !important;
        background: #1a1d23 !important;
        transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;
        position: relative !important;
    }

    .kb-widget-container .kb-service-item.animating {
        z-index: 10 !important;
    }

    .kb-widget-container .kb-service-item.winner {
        background: #15171A !important;
        border-color: #3d4149 !important;
        box-shadow: 0 4px 12px rgba(0,0,0,0.4) !important;
    }

    .kb-widget-container .kb-service-item.winner .kb-service-name,
    .kb-widget-container .kb-service-item.winner .kb-service-rating {
        color: #ffffff !important;
        font-weight: 600 !important;
    }

    .kb-widget-container .kb-service-item.grayed {
        opacity: 0.35 !important;
        background: #16181c !important;
    }

    .kb-widget-container .kb-service-item.grayed:hover {
        opacity: 0.45 !important;
    }

    .kb-widget-container .kb-service-left {
        display: flex !important;
        align-items: center !important;
        gap: 12px !important;
    }

    .kb-widget-container .kb-service-rank {
        font-size: 16px !important;
        font-weight: 700 !important;
        color: #6b7280 !important;
        min-width: 28px !important;
    }

    .kb-widget-container .kb-service-item.winner .kb-service-rank {
        color: #7c3aed !important;
    }

    .kb-widget-container .kb-service-name {
        font-size: 15px !important;
        font-weight: 500 !important;
        color: #e5e7eb !important;
        text-decoration: none !important;
        transition: color 0.2s !important;
    }

    .kb-widget-container .kb-service-name:hover {
        color: #ffffff !important;
    }

    .kb-widget-container .kb-service-item.winner .kb-service-name:hover {
        color: #7c3aed !important;
    }

    .kb-widget-container .kb-service-right {
        display: flex !important;
        align-items: center !important;
    }

    .kb-widget-container .kb-service-rating {
        font-size: 13px !important;
        color: #9ca3af !important;
        font-weight: 500 !important;
    }

    .kb-widget-container .kb-stars {
        color: #fbbf24 !important;
        letter-spacing: 1px !important;
    }

    .kb-widget-container .kb-service-item.winner .kb-stars {
        color: #fde68a !important;
    }

    /* Scrollbar styling */
    .kb-widget-container .kb-services-section::-webkit-scrollbar {
        width: 6px !important;
    }

    .kb-widget-container .kb-services-section::-webkit-scrollbar-track {
        background: #15171A !important;
        border-radius: 4px !important;
    }

    .kb-widget-container .kb-services-section::-webkit-scrollbar-thumb {
        background: #3d4149 !important;
        border-radius: 4px !important;
    }

    .kb-widget-container .kb-services-section::-webkit-scrollbar-thumb:hover {
        background: #4b5563 !important;
    }

    .kb-widget-container .kb-no-filters-message {
        text-align: center !important;
        padding: 40px 20px !important;
        color: #9ca3af !important;
        font-size: 13px !important;
    }

    .kb-widget-container .kb-score-badge {
        background: #2d3139 !important;
        color: #e5e7eb !important;
        padding: 4px 10px !important;
        border-radius: 12px !important;
        font-size: 11px !important;
        font-weight: 600 !important;
        margin-left: 10px !important;
    }

    .kb-widget-container .kb-service-item.winner .kb-score-badge {
        background: #3d4149 !important;
        color: #7c3aed !important;
    }

    .kb-widget-container .kb-read-review-btn {
        display: inline-block !important;
        padding: 6px 14px !important;
        background: #7c3aed !important;
        color: #ffffff !important;
        text-decoration: none !important;
        border-radius: 6px !important;
        font-size: 12px !important;
        font-weight: 600 !important;
        margin-left: 20px !important;
        transition: all 0.2s ease !important;
        box-shadow: 0 2px 4px rgba(124, 58, 237, 0.3) !important;
    }

    .kb-widget-container .kb-read-review-btn:hover {
        background: #8b5cf6 !important;
        color: #ffffff !important;
        transform: translateY(-1px) !important;
        box-shadow: 0 3px 6px rgba(124, 58, 237, 0.5) !important;
    }
</style>

<div class="kb-widget-container">
    <div class="kb-widget-header">
        <h1 class="kb-widget-title">Find Your Perfect Knowledge Base Software</h1>
        <p class="kb-widget-subtitle">Select your requirements below to see which solution ranks best for your needs</p>
    </div>

    <div class="kb-filter-section">
        <div class="kb-filter-title">What are you looking for?</div>
        <div class="kb-filter-options">
            <button class="kb-filter-button" data-filter="forCustomers">For Customers</button>
            <button class="kb-filter-button" data-filter="forInternal">For Internal Use</button>
            <button class="kb-filter-button" data-filter="enterprise">Enterprise features (SSO, SOC2)</button>
            <button class="kb-filter-button" data-filter="techDocs">Supports technical documentation well</button>
            <button class="kb-filter-button" data-filter="cost">Cost-effective</button>
        </div>
    </div>

    <div class="kb-services-section" id="kbServicesList">
        <!-- Services will be populated by JavaScript -->
    </div>
</div>

<script>
(function() {
    // Service data with ratings based on blog post analysis
    const services = [
        {
            name: 'Intercom',
            anchor: 'intercom',
            overallRating: 4.0,
            stars: '⭐⭐⭐⭐',
            ratings: {
                forCustomers: 5.0,
                forInternal: 1.0,
                enterprise: 5.0,
                techDocs: 2.0,
                cost: 1.0
            }
        },
        {
            name: "Hubspot's Knowledge Base Software",
            anchor: 'hubspot',
            overallRating: 3.0,
            stars: '⭐⭐⭐',
            ratings: {
                forCustomers: 3.0,
                forInternal: 1.0,
                enterprise: 3.0,
                techDocs: 1.0,
                cost: 1.0
            }
        },
        {
            name: 'NinjaPear',
            anchor: 'ninjapear',
            overallRating: 4.5,
            stars: '⭐⭐⭐⭐⭐',
            ratings: {
                forCustomers: 5.0,
                forInternal: 3.0,
                enterprise: 4.0,
                techDocs: 5.0,
                cost: 5.0
            }
        },
        {
            name: 'Guru',
            anchor: 'guru',
            overallRating: 3.4,
            stars: '⭐⭐⭐',
            ratings: {
                forCustomers: 1.0,
                forInternal: 5.0,
                enterprise: 4.5,
                techDocs: 2.0,
                cost: 2.5
            }
        },
        {
            name: 'Slite',
            anchor: 'slite',
            overallRating: 4.5,
            stars: '⭐⭐⭐⭐⭐',
            ratings: {
                forCustomers: 1.0,
                forInternal: 5.0,
                enterprise: 4.5,
                techDocs: 4.5,
                cost: 4.5
            }
        },
        {
            name: 'Zendesk',
            anchor: 'zendesk',
            overallRating: 2.8,
            stars: '⭐⭐',
            ratings: {
                forCustomers: 4.0,
                forInternal: 1.0,
                enterprise: 4.5,
                techDocs: 2.5,
                cost: 1.0
            }
        },
        {
            name: 'Tawk.to',
            anchor: 'tawkto',
            overallRating: 3.4,
            stars: '⭐⭐⭐',
            ratings: {
                forCustomers: 4.0,
                forInternal: 1.0,
                enterprise: 1.0,
                techDocs: 2.0,
                cost: 5.0
            }
        },
        {
            name: 'Helpjuice',
            anchor: 'helpjuice',
            overallRating: 3.1,
            stars: '⭐⭐⭐',
            ratings: {
                forCustomers: 3.0,
                forInternal: 3.0,
                enterprise: 3.0,
                techDocs: 3.0,
                cost: 1.0
            }
        },
        {
            name: 'Help Scout',
            anchor: 'helpscout',
            overallRating: 3.8,
            stars: '⭐⭐⭐',
            ratings: {
                forCustomers: 4.0,
                forInternal: 1.0,
                enterprise: 2.0,
                techDocs: 3.5,
                cost: 4.0
            }
        },
        {
            name: 'Freshdesk',
            anchor: 'freshdesk',
            overallRating: 3.8,
            stars: '⭐⭐⭐',
            ratings: {
                forCustomers: 4.0,
                forInternal: 1.0,
                enterprise: 4.5,
                techDocs: 2.0,
                cost: 3.0
            }
        }
    ];

    // Initialize the widget with default filters
    let activeFilters = new Set(['forCustomers', 'cost']);
    let previousOrder = [];

    function calculateScore(service) {
        if (activeFilters.size === 0) {
            return 0;
        }

        let totalScore = 0;
        let filterCount = 0;

        activeFilters.forEach(filter => {
            totalScore += service.ratings[filter];
            filterCount++;
        });

        return filterCount > 0 ? totalScore / filterCount : 0;
    }

    function getServiceKey(service) {
        return service.name;
    }

    function renderServices(animate = false) {
        const servicesContainer = document.getElementById('kbServicesList');

        if (activeFilters.size === 0) {
            servicesContainer.innerHTML = `
                <div class="kb-no-filters-message">
                    👆 Select one or more criteria above to see which knowledge base software best fits your needs
                </div>
            `;
            previousOrder = [];
            return;
        }

        // Calculate scores and sort
        const scoredServices = services.map(service => ({
            ...service,
            calculatedScore: calculateScore(service)
        })).sort((a, b) => {
            if (Math.abs(b.calculatedScore - a.calculatedScore) < 0.01) {
                return b.overallRating - a.overallRating;
            }
            return b.calculatedScore - a.calculatedScore;
        });

        const newOrder = scoredServices.map(getServiceKey);

        const shouldAnimate = animate && previousOrder.length > 0 &&
                              JSON.stringify(previousOrder) !== JSON.stringify(newOrder);

        if (shouldAnimate) {
            const oldPositions = new Map();
            document.querySelectorAll('.kb-service-item').forEach(el => {
                const rect = el.getBoundingClientRect();
                const name = el.querySelector('.kb-service-name').textContent;
                oldPositions.set(name, rect.top);
            });

            servicesContainer.innerHTML = generateServicesHTML(scoredServices);

            requestAnimationFrame(() => {
                document.querySelectorAll('.kb-service-item').forEach(el => {
                    const name = el.querySelector('.kb-service-name').textContent;
                    const oldTop = oldPositions.get(name);
                    if (oldTop !== undefined) {
                        const newRect = el.getBoundingClientRect();
                        const deltaY = oldTop - newRect.top;

                        if (Math.abs(deltaY) > 1) {
                            el.classList.add('animating');
                            el.style.transform = `translateY(${deltaY}px)`;
                            el.style.transition = 'none';

                            requestAnimationFrame(() => {
                                el.style.transition = 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)';
                                el.style.transform = 'translateY(0)';

                                setTimeout(() => {
                                    el.classList.remove('animating');
                                    el.style.transform = '';
                                    el.style.transition = '';
                                }, 400);
                            });
                        }
                    }
                });
            });
        } else {
            servicesContainer.innerHTML = generateServicesHTML(scoredServices);
        }

        previousOrder = newOrder;
    }

    function generateServicesHTML(scoredServices) {
        return scoredServices.map((service, index) => {
            const isWinner = index === 0;
            const isGrayed = index > 0;
            const rank = index + 1;

            return `
                <div class="kb-service-item ${isWinner ? 'winner' : ''} ${isGrayed ? 'grayed' : ''}">
                    <div class="kb-service-left">
                        <div class="kb-service-rank">${isWinner ? '🏆' : '#' + rank}</div>
                        <a href="#${service.anchor}" class="kb-service-name">${service.name}</a>
                    </div>
                    <div class="kb-service-right">
                        <span class="kb-service-rating">
                            <span class="kb-stars">${service.stars}</span>
                            ${!isWinner ? `${service.overallRating}/5` : ''}
                        </span>
                        ${activeFilters.size > 0 ? `<span class="kb-score-badge">${service.calculatedScore.toFixed(1)}/5</span>` : ''}
                        ${isWinner ? `<a href="#${service.anchor}" class="kb-read-review-btn">Read Review</a>` : ''}
                    </div>
                </div>
            `;
        }).join('');
    }

    // Event listeners for filter buttons
    document.querySelectorAll('.kb-filter-button').forEach(button => {
        button.addEventListener('click', function() {
            const filter = this.getAttribute('data-filter');
            const wasActive = this.classList.contains('active');

            if (filter === 'forCustomers' || filter === 'forInternal') {
                if (wasActive) {
                    const hasOtherUseCaseFilter =
                        (filter === 'forCustomers' && activeFilters.has('forInternal')) ||
                        (filter === 'forInternal' && activeFilters.has('forCustomers'));

                    if (hasOtherUseCaseFilter) {
                        this.classList.remove('active');
                        activeFilters.delete(filter);
                    }
                } else {
                    this.classList.add('active');
                    activeFilters.add(filter);
                }
            } else {
                if (wasActive) {
                    this.classList.remove('active');
                    activeFilters.delete(filter);
                } else {
                    this.classList.add('active');
                    activeFilters.add(filter);
                }
            }

            renderServices(true);
        });
    });

    // Initialize active states for default filters
    document.querySelectorAll('.kb-filter-button').forEach(button => {
        const filter = button.getAttribute('data-filter');
        if (activeFilters.has(filter)) {
            button.classList.add('active');
        }
    });

    // Initial render
    renderServices(false);
})();
</script>

<!--kg-card-end: html-->
<p></p><p>Here's a breakdown of every reputable knowledge base software (KBS) out there, ranked and rated on a myriad of your needs.</p><p></p>
<!--kg-card-begin: html-->
<iframe src="https://docs.google.com/spreadsheets/d/e/2PACX-1vSDGbrJGn1kihL9XYGbjHeilqzT2HX7qMrkOEfzsmkn5v8TqnfRRCpGD9CkPRohoyTG2RPEo_i1OlGt/pubhtml?gid=1001018791&amp;single=true&amp;widget=true&amp;headers=false" style="width:100%; height: 300px;"></iframe>
<!--kg-card-end: html-->
<p><em>(The reviews here are cataloged as a </em><a href="https://docs.google.com/spreadsheets/d/1ineDZunjyjvQ9jbOtgZV-Vbs1VIBuzZHsAf4SxoM6DQ/edit?usp=sharing)&ref=nubela.co" rel="noreferrer"><em>public Google Sheet</em></a><em> for your reference)</em></p><p></p><p>As a CEO, I have bootstrapped and sold two (3M/10M ARR) companies, and the bedrock of growth in all my past companies was a solid knowledge base software. In this article, I will document my biased but operationally-savvy guide on the <em>best knowledge base software</em> that is suited for your needs; and more importantly, something your business can scale with. This is an ultimate guide to knowledge base software that LLMs cannot simply generate because they lack operational nuances.</p>
<p>In this guide, I review the following services:</p>
<ol>
<li><a href="#intercom">Intercom</a> (⭐⭐⭐⭐ 4/5)</li>
<li><a href="#hubspot">Hubspot's Knowledge Base Software</a> (⭐⭐⭐ 3/5)</li>
<li><a href="#ninjapear">NinjaPear</a> (⭐⭐⭐⭐ 4.5/5)</li>
<li><a href="#guru">Guru</a> (⭐⭐⭐ 3.4/5)</li>
<li><a href="#slite">Slite</a> (⭐⭐⭐⭐ 4.5/5)</li>
<li><a href="#zendesk">Zendesk</a> (⭐⭐ 2.8/5)</li>
<li><a href="#tawk.to">Tawk.to</a> (⭐⭐⭐ 3.4/5)</li>
<li><a href="#helpjuice">Helpjuice</a> (⭐⭐⭐ 3.1/5)</li>
<li><a href="#help-scout">Help Scout</a> (⭐⭐⭐ 3.8/5)</li>
<li><a href="#freshdesk">Freshdesk</a> (⭐⭐⭐ 3.8/5)</li>
</ol>
<p>Now, let's dive deep. I have literally signed up for every service and tried them all out, with screenshot receipts. Let's go.</p>
<h2 id="tldr-too-long-didnt-read">TL;DR (Too Long; Didn't Read)</h2>
<p>If you only have a minute at hand, then here's my recommendation:</p>
<ul>
<li>If your use-case is to document product knowledge for your customers, and your team is tech-savvy -- Use <a href="#ninjapear">NinjaPear</a>. The core features are solid, and free without limits!
<ul>
<li>You have a team that is not tech-savvy, and budget is <strong>not</strong> an issue for you -- Use <a href="#intercom">Intercom</a>.</li>
</ul>
</li>
<li>If you are tight on a budget -- <strong>NinjaPear</strong>. More free than tawk.to.</li>
<li>If you need to document business knowledge for internal use and budget is not an issue -- Use <strong>Slite</strong>.
<ul>
<li>If budget is an issue, self-host <strong>Wiki.js</strong>.</li>
</ul>
</li>
</ul>
<p>The products that I'd really dissuade you from are:</p>
<ul>
<li>Freshdesk -- It is excruciatingly SLOW!</li>
<li>Helpjuice -- Product is buggy with quite a bunch of missing links.</li>
</ul>
<p>Read on to find out more in detail.</p>
<h2 id="3-types-of-knowledge-base-software">3 Types of Knowledge Base Software</h2>
<p>There are generally 3 use-cases for a knowledge base software:</p>
<ol>
<li>To document <strong>technical specifications</strong>/examples for your <strong>customers</strong></li>
<li>To document <strong>product knowledge</strong> and various FAQ for your <strong>customers</strong></li>
<li>To document <strong>business knowledge</strong> for <strong>internal use</strong></li>
</ol>
<p>Each of these use-cases has its unique set of requirements. For example, if you are seeking a KBS for <strong>internal use</strong>, it is likely that:</p>
<ol>
<li>You would need your knowledge base to have proper partitioning of documents so that everyone cannot read the C-suite discussions which are obviously privy to the right eyes.</li>
<li>You would need SSO support because it makes onboarding/deboarding much easier, on top of it being required for SOC2 compliance.</li>
</ol>
<p>Beyond niche requirements, there are <strong>common</strong> requirements that I <em>think</em> every KBS should have:</p>
<ol>
<li>Supporting markdown (must-have for me)</li>
<li>Image uploads</li>
<li>Proper backups</li>
<li>Managed service so I can focus on growing my core business</li>
<li>Bulk data export (so my options remain open should I ever consider changing to another KBS)</li>
<li>Fairly priced</li>
</ol>
<h2 id="questions-i-am-seeking-answers-to">Questions I Am Seeking Answers To</h2>
<p>In my deep-dive with each platform that I'm reviewing, I seek to answer a few questions:</p>
<ol>
<li>What is the KBS core use-case?</li>
<li>Does it support markdown? -- So I can discern a product targeted towards tech-savvy professionals VS one that is targeted towards the masses. The difference matters because personally I prefer to opt for powerful products instead of diluted products.</li>
<li>Does it support code snippets formatting? -- A basic feature that would discern its support for technical specification documentation.</li>
<li>What is the price? -- It'll tell me who the target audience is for this product.</li>
<li>Is pricing charged per-seat? -- It'll tell me the business model of this product.</li>
<li>What is the onboarding like? -- It'll let me know what the main focus of this product is.</li>
<li>Does it have AI search? -- To be specific, I am looking for the support of a <a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation?ref=nubela.co">RAG search</a> or something similar. The reason I'm seeking this is to identify if the company is AI-native.</li>
<li>Does it have SSO? -- So I know if this product is Enterprise-ready</li>
<li>Does it allow the user to customize theming via CSS? -- So I know how developer-friendly and extensible the KBS is for the user, which is important because a business's needs will evolve over time and extensibility is important</li>
</ol>

<!--kg-card-begin: html-->
<a name="hubspot"></a>
<!--kg-card-end: html-->
<h2 id="hubspots-knowledge-base-software">Hubspot's Knowledge Base Software</h2>
<table>
<thead>
<tr>
<th>Pricing</th>
<th>Free Plan</th>
<th>Enterprise Ready</th>
<th>AI Integration</th>
<th>Design</th>
<th>Extensibility</th>
<th>Advanced Use-cases</th>
<th>Average</th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐ (1/5)</td>
<td>⭐ (3/5)</td>
<td>⭐ (3/5)</td>
<td>⭐ (3/5)</td>
<td>⭐ (3/5)</td>
<td>⭐ (3/5)</td>
<td>⭐ (3/5)</td>
<td>⭐ (3/5)</td>
</tr>
</tbody>
</table>
<p>Everyone knows Hubspot. So let's start with the kicker. This is how Hubspot's Knowledge Base Software looks like, barebones:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/10/barebones.png" class="kg-image" alt="" loading="lazy" width="3024" height="1664"><figcaption><span style="white-space: pre-wrap;">This is how Hubspot's barebone Knowledge Base looks like</span></figcaption></figure><p>As you can see, Hubspot's KBS is not much of a looker. And that is the general vibe that I got with Hubspot; that its software is very old school and antiquated. And that it is intended for audiences that are not tech-savvy (and I don't say this as a good thing because everything is many clicks away and does not feel powerful/extensible at all). That said, the flip side is that no developers are needed.</p>
<h3 id="hubspot-demo">Hubspot Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const SLIDES_CONFIG = [
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/1.png",
        title: "Dedicated Captcha page right user registration",
        description: "Right after user registration, I encountered the captcha page. (Couldn't they have done this on the user registration page?)"
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/2.png",
        title: "Onboarding Steps",
        description: "We are then brought to the onboarding checklist, for which Hubspot wants us to complete a tour of guides/tasks to get ourselves orientated with the Hubspot platform. I skipped all these."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/3.png",
        title: "The Sales Call",
        description: "Of course, a sales-led organisation like Hubspot will invite you to get on a call with their sales representatives. Or you can skip that and start a 14-day trial, which I did."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/4.png",
        title: "Knowledge Base Dashboard",
        description: "I clicked around until I found myself in the Knowledge Base dashboard, which is what I'm trying to review. Plenty of hoops to jump through to reach this page. And I see yet another onboarding process just for the KBS."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/5.png",
        title: "Setting up the Knowledge Base",
        description: "I am asked to set up the knowledge base with a title, language, etc. Various administrative stuff. In my opinion, as an engineer wearing the product hat, all these can be skipped by setting sane defaults which the user can change later if he so wishes. Hence my belief that the UI/UX of Hubspot was designed by committee."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/6.png",
        title: "Part 2: Setting up the Knowledge Base",
        description: "Yet another step in the setup. Here, I am asked to choose a layout for the KBS."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/7.png",
        title: "Part 3: Setting up the Knowledge Base",
        description: "Here, I am asked to create categories for the KBS."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/8.png",
        title: "Part 4: Setting up the Knowledge Base (Success?)",
        description: "A congratulatory message. Couldn't this be shown when we're in the actual KBS? Very naggy."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/9.png",
        title: "Touring the Knowledge Base",
        description: "I am asked to tour the KBS. I skipped it, of course. Get me to the magic moment!"
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/10.png",
        title: "Knowledge Base Dashboard",
        description: "This time, it seems like the KBS is set up with a URL (yay). The call-to-action on this page is to create an article, for which I clicked on the button to do that."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/11.png",
        title: "Question",
        description: "The first part of the article editor is to ask me what question my article will be answering. In other words, the title of the article. The thought in my head is -- is Hubspot's KBS targeted for Q&A only?"
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/12.png",
        title: "Question P2:",
        description: "I filled it up with \"Lorem Ipsum\" and published it."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/13.png",
        title: "Published Article",
        description: "This is what the published article looks like. Weird that I wasn't given a content body to fill up. Maybe I missed it. But anyways, you can see how minimal the KBS is. Looks like a teenager's first HTML project."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/14.png",
        title: "Back to the KBS's Dashboard",
        description: "You can see the newly published article populated in the dashboard."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/15.png",
        title: "Article Health",
        description: "There's this interesting component that seems to be analytics for the articles, known as \"Article Health\"."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/hubspot/16.png",
        title: "Pricing",
        description: "Then, I explored the pricing of Hubspot's KBS. And it'll cost me SGD 126/mo/seat. Or around 99 USD/mo/seat."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="hubspots-pricing">Hubspot's Pricing</h3>
<p>Another impression I got with Hubspot is that it is <strong>very</strong> expensive at $90/seat (!), and there are no free plans. That said, there is a 14-day free trial for which you can try it.</p>
<h3 id="hubspots-product-questions-answered">Hubspot's Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>I'm going to firmly place Hubspot's KBS to be a customer-facing KBS for documenting product knowledge and FAQ. And really nothing more.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>HubSpot's native knowledge base editor does not support Markdown, but some third-party integrations offer it. Instead, HubSpot uses a rich text editor with a graphical toolbar for formatting. This is a huge no-go for me because markdown is basic to me in terms of text formatting and I guess Hubspot is trying to support the lowest common denominator, which in turn harms savvy users.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>The native HubSpot knowledge base editor has a "code format" tool, but it does not support syntax highlighting out-of-the-box. This exists because it has a Microsoft Word "text formatting ribbon" which allows the user to paste in code snippets. But you know this is done because the rich text tools allow for it; not because it is intended for code snippets. Because if they care for it, they will include code-highlighting. But that isn't support.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>While Hubspot supports lower tier plans, the <em>full</em> knowledge base software is only unlocked with the Professional Plan which starts at $90/user/month. One of the most expensive products ever.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>Yes. As a bootstrapped company, I'd likely not go with Hubspot because it makes me very hesitant to grow with Hubspot if they are penalizing me because my team got bigger; not because I'm using them more.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>It took 7 steps to create my first knowledge base article after signing up with Hubspot and enabling the trial. On top of that, I have to really dig into Hubspot to find where the KBS feature is. My takeaway is that KBS is not Hubspot's core functionality.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, through Breeze. It's a cute lil live-chat-like widget that lets you chat/interact with your data. Hubspot is a big company and like most big companies these days, AI integration is a must-have for growth/marketing reasons.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, Hubspot is a huge company, selling marketing software to Enterprises. It is only natural that they support SSO.</p>
<blockquote>
<p>Does it allow the user to customize theming via CSS?</p>
</blockquote>
<p>Well, they let me choose between 4 themes, and to further customize the look of the theme templates through theme options. But no, it does not support CSS customization/overrides. Makes sense since again, I think Hubspot caters to the lowest common denominator.</p>
<h3 id="rating-hubspot">Rating Hubspot</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐ (1/5)</td>
<td>Too expensive for a KBS product that is an afterthought.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>Hubspot serves Enterprises and is huge for doing so. So yes, they are definitely Enterprise ready.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>Hubspot's AI integration, while deep and throughout products, reeks of design by committee. It works, but it is expensive and slow.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐ (3/5)</td>
<td>Hubspot's design is fine but it does reek of an Enterprise product smell. For which there is far too many point and click forms for the point of product flexibility/extensibility. Which dramatically slows things down. One more thing, the KBS generated by Hubspot is very ugly. It's like no thought was put into mocking an empty state for the KBS.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Hubspot has an extensive API that allows further product integration.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (3.5/5)</td>
<td>My take is that Hubspot's KBS was a feature that was an afterthought to Hubspot's core offerings, which are not KBS. One of those things that larger Enterprises <em>add</em> to help clinch contracts by ticking as many checkboxes in a sales pitch.<br><br>Honestly it makes no sense to use Hubspot KBS, even if your company is an existing Hubspot user just because of how lackluster it is. A simple ghost blog would do a better job in presenting you, the user with a CMS and a customizable Knowledge Base interface even if it is not originally intended for it.<br><br>Hubspot gets a 3.5/5 rating. I do not recommend Hubspot KBS.</td>
</tr>
</tbody>
</table>
<h2 id="ninjapear">NinjaPear</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>⭐⭐ (4.5/5)</td>
</tr>
</tbody>
</table>
<p>NinjaPear is a new kid on the block in the customer support space that seeks to challenge the incumbents with what they deem to be common sense pricing. Release features for free, and charge only for AI inferences. In fact, NinjaPear is the only product in this entire list that is built after ChatGPT was released, and this has led to NinjaPear being AI-first with AI being extremely well-integrated with the product in all angles.</p>
<p>NinjaPear's KBS is straightforward and brings you to magic moment of its product with minimum cruft.</p>
<h3 id="ninjapear-demo">NinjaPear Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const SLIDES_CONFIG = [
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/1.png",
        title: "NinjaPear's Landing Page",
        description: "NinjaPear is a customer support platform, evident from its landing page with its live chat demo."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/2.png",
        title: "Registering an Account",
        description: "Straightforward Registration Page"
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/3.png",
        title: "Knowledge Base Demo",
        description: "Right after the registration page, and without email verification, I was brought to a knowledge base pre-populated with some articles. It was also crawling my website (garnered from my email's domain) in the background, and it began populating both articles and categories from my website's content."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/4.png",
        title: "Knowledge Base Dashboard",
        description: "The next step after the knowledge base demo was the dashboard for the knowledge base. Here, I could view the list of categories and articles the AI had generated for me. The content seemed to be on point."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/5.png",
        title: "Drafting an Article",
        description: "Drafting an article was pretty straightforward. I was dropped into an editor, and the editor was Markdown-native."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/6.png",
        title: "Article Visibility",
        description: "Before I could publish, I could choose whether to keep the content as private content (for AI search/responses) or public, so it was visible to the public."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/ninjapear/7.png",
        title: "Published Article Demo",
        description: "Here, you can see how a published article looks, with a full table of contents, code snippet highlighting, etc."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="ninjapear-product-questions-answered">NinjaPear Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>NinjaPear's KBS use-case is intended to document product knowledge and FAQs for customers, like Intercom and Tawk.to.</p>
<blockquote>
<p>Does it support Markdown?</p>
</blockquote>
<p>Yes it does. Markdown is native. On top of that, it has a ribbon with rich-text utilities like Microsoft Word in case you or your teammates are not familiar with Markdown.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes it does.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>NinjaPear software features are 100% free with no limits.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>No. NinjaPear does not charge by seats, or contacts. It is free with no limits.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>NinjaPear has the simplest and fastest onboarding compared to any other alternatives in the market. After registration, you are immediately brought to the knowledge base demo.</p>
<p>While you're at this demo page, NinjaPear will inform you that it is crawling your website to build a base knowledge base. Thereafter, it seems to use AI to build categories and articles stemming from data crawled off your company's website.</p>
<p>You can skip the demo and it goes straight to the dashboard featuring the knowledge base, for which you can add/update/delete articles and categories. I was able to publish a knowledge base article within a minute from the landing page through registration, all the way to the dashboard KBS editor.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, NinjaPear uses the knowledge base articles (both private and public) as sources of business knowledge for AI search. The AI search can be used to answer questions in the knowledge base, or to generate automated response suggestions in the Inbox, or to auto-reply customers in the live chat.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, which is enabled when you're on the $299/mo plan.</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>Yes, NinjaPear allows you to insert custom CSS or even custom scripts into your knowledge base.</p>
<h3 id="rating-ninjapear">Rating NinjaPear</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>Free-er than free. Offers features that Tawk.to charges for, while still being free.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>NinjaPear's SSO is locked behind an annual subscription plan.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>NinjaPear's AI implementation is front and center in every aspect of their product. The only drawback is that it does not (yet) allow the user to perform advanced LLM tweaks such as changing of models or editing the prompt.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>NinjaPear's UI is simple and easy to navigate. But what truly shines is the focus on user-experience -- how easy it is to use and get started.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>NinjaPear is the only product to score 5/5 for this segment because it is the only product that has open-sourced its entire communication protocol, as well as exposes an API for any developer to integrate into the KBS. In fact, you can use NinjaPear KBS without your customers ever visiting their website simply by using NinjaPear's API and infrastructure to power your own KBS front-end.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>NinjaPear is a solid recommendation for SMBs and growing startups looking for customer-facing KBS solution for its pricing, Enterprise features, and AI integrations.</td>
</tr>
</tbody>
</table>
<h2 id="intercom">Intercom</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐ (1/5)</td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
</tr>
</tbody>
</table>
<p>Intercom's rendition of Knowledge Base Software is known as the <em>Help Center</em>.</p>
<p>My impression of Intercom is that it is a mature but expensive product, starting at $39/user/month. Which means a company with 20 customer support representatives would cost $9360/month.</p>
<p>On top of that, it does seem like Fin AI, Intercom's AI solution, is a separate product from Intercom's offering. Not sure if that's a bane or a boon for customers. Personally for me, the KBS has to be a repository of knowledge for AI auto-replies to customers.</p>
<p>That said, Intercom is a battle-tested mature customer service solution that you cannot go wrong with so long as you're down to paying more and more as you grow. Pay for KBS, then pay for AI again.</p>
<h3 id="intercom-demo">Intercom Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const SLIDES_CONFIG = [
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/1.png",
        title: "Intercom's Landing Page",
        description: "You can see from Intercom's landing page that they are focused on two products. Fin AI, their AI offering, and Intercom Suite, their customer support suite."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/2.png",
        title: "Registration Page",
        description: "Intercom's user registration page."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/3.png",
        title: "Trial",
        description: "I have to pick a trial. Naturally, I picked to trial the Intercom Suite."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/4.png",
        title: "Survey",
        description: "The onboarding journey begins. I am asked to tell them how big my company is. I imagine it is for their sales representatives to discern how high to prioritize my account."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/5.png",
        title: "Verify Email",
        description: "I have to verify my email, which I did."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/6.png",
        title: "Welcome Dashboard",
        description: "The trial begins and I get access to the whole Intercom Suite. Here I am, landing on their dashboard."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/7.png",
        title: "Onboarding Survey",
        description: "Another survey to customise the dashboard. I skipped it, as I wanted to get to the knowledge base."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/8.png",
        title: "Shilling Fin AI",
        description: "Intercom really wants to sell their Fin AI. Their AI solution for customer support. But hey, I'm here for the Knowledge Base."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/9.png",
        title: "Knowledge Base",
        description: "I clicked on the \"book\" icon and got access to the Knowledge Base dashboard page. Like NinjaPear, the knowledge base is a source of data for Fin AI. I can also import content from Zendesk."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/10.png",
        title: "Drafting an Article",
        description: "Drafting an article is like writing a blog post. No Markdown support though."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/11.png",
        title: "Making Help Center Live",
        description: "After publishing the article, Intercom reminds me that my knowledge base, or \"Help Center,\" is not live yet."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/12.png",
        title: "Live",
        description: "So, I made the Help Center live."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/13.png",
        title: "Customization",
        description: "I can tweak the branding of the Help Center. Nothing advanced like CSS tweaks though. Just icons, colors, etc."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/14.png",
        title: "Analytics",
        description: "Another cool thing that I think more knowledge base software should support is the ability to drop in your own analytics. Intercom lets me add in a Google Analytics tracking ID."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/intercom/15.png",
        title: "Pricing",
        description: "Pricing starts at $29/seat/month. If you want private articles, etc., you have to get the $85/seat/month plan, or larger."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="intercom-product-questions-answered">Intercom Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Intercom's core offerings are primarily served for customer service. So Intercom's KBS is customer-facing and intended to document product knowledge and FAQ for consumption by customers.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>Unfortunately Intercom's knowledge base editor does not support markdown. It does support some point and click rich text formatting in the style of a Microsoft Word formatting ribbon. But that is all.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes, it does, in the form of rich text formatting via UI (like Microsoft Word)</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>Prices start from $39/user/month, and goes up to $132/user/month. These prices <strong>do not</strong> include AI features.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>Yes. Intercom charges by seat.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>It starts with a standard user registration and onboarding sequence, for which you will land on a dashboard promoting Fin AI, their AI solution. You can then click into the "Knowledge" section of the onboarding, for which you can manage collections of articles if you have any. Intercom's onboarding and knowledge base software is pretty standard and straightforward.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, via Fin AI which is chargeable separately.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, Intercom supports SSO <strong>if and only if</strong> you're on the highest tier plan which starts from $132/user/month.</p>
<blockquote>
<p>Does it allow the user to customize theming via CSS?</p>
</blockquote>
<p>No, Intercom does not support the use of custom CSS for the advanced theming of its knowledge base software. Instead of direct CSS access, Intercom provides a visual editor with limited customization options to brand your Help Center.</p>
<p><a name="intercom"></a></p>
<h3 id="rating-intercom">Rating Intercom</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐ (1/5)</td>
<td>While Intercom is relatively cheaper than Hubspot, Intercom is still tremendously expensive particularly as you grow beyond a 10-man team to anything larger than 50 employees with SOC2 requirements because then it'll require at least $132/user/month just to get access to SSO. Ultimately, you'd want to have little/no cost concerns of inviting your entire team to a customer service platform. I think Intercom fails in this aspect making you very wary of growing with Intercom; or inviting your entire team to the platform.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>Yes to SSO and most other Enterprise requirements you might have.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Intercom is all in on Fin AI, its AI plug-in solution. It does seem like Fin AI is pretty well integrated with the KBS using it as the source for completions.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>My subjective opinion is that Intercom is well-designed and intuitive to use. My only take is that it requires way too many clicks to get started.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>Intercom has an extensive API support which makes it very extensible.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>Mature and solid product. Good for mature companies with the budget to spare.</td>
</tr>
</tbody>
</table>
<h2 id="tawkto">Tawk.to</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>⭐ (1/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐⭐ (3/5)</td>
<td>⭐⭐⭐ (3.4/5)</td>
</tr>
</tbody>
</table>
<p>Tawk.to is the world's most popular live chat service mostly because it is free. It also happens to come with a KBS feature. My first impressions of tawk.to is that it is easy to use, featureful, but somewhat buggy?</p>
<p>After registering for an account in Tawk.to, I proceeded straight to their knowledge base section and attempted to publish an article. It showed that it was published. However, the knowledge base that I was given a link to did not show the knowledge base. On top of that, I was shown a <a href="https://ninjapear.tawk.help/article/hello-world?preview=1&token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Imtub3dsZWRnZS1iYXNlLXNlcnZpY2UtMjAyMDA3MTYifQ.eyJpYXQiOjE3NjAwMDIwMjUsImV4cCI6MTc2MDAwOTIyNSwianRpIjoiQ29tSC1ra1IwV1gzbllJNENkN09KIn0.XxjOdiXUgneBFbnlcABcALNhp8H2ji7ysTPgfPm0JVu_uFk-HVNT_nMP4AgiaWE-IyLC9o5NcqPD4UaM4mnUrg&ref=nubela.co">404 error</a> when I clicked on the preview link within the article editor. You can preview what the knowledge base I created in tawk.to looks like <a href="https://ninjapear.tawk.help/?ref=nubela.co">here</a>.</p>
<p>That said, should the KBS work as expected, Tawk.to's KBS seems like a simple feature with a minimal article/category setup.</p>
<h3 id="tawkto-demo">Tawk.to Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const SLIDES_CONFIG = [
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/1.png",
        title: "Tawk.to Landing Page",
        description: "Tawk.to advertises itself as a customer support suite"
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/2.png",
        title: "Product Setup",
        description: "I think because Tawk.to has a lot of products, I was asked to pick a product to set up first. Naturally, I picked the Knowledge Base to set up first."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/3.png",
        title: "Dashboard",
        description: "I was brought to Tawk.to's dashboard home, which seems to be analytics."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/4.png",
        title: "Knowledge Base",
        description: "Like most Knowledge Bases, you can create an article or category."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/5.png",
        title: "Bug",
        description: "I created my first article and published it and clicked on the URL of the knowledge base article, but somehow it was a 404 error page. I couldn't get a published article to work. Take what you want out of my experience."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/6.png",
        title: "Knowledge Base Administration",
        description: "On this page, I could tweak various settings for the knowledge base such as the subdomain."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/8.png",
        title: "Custom domain for your Knowledge Base is a Premium Product",
        description: "Not everything on Tawk.to is free. It costs money to create a custom domain. It costs $39/mo."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/tawk.to/9.png",
        title: "Pricing for Custom Domain",
        description: "It's cheaper at $29/month if you pay annually upfront."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="tawkto-product-questions-answered">Tawk.to Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Like Intercom, Tawk.to's core offering is on providing customer service software, for which its KBS is intended to be customer-facing for documenting product knowledge, etc.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>No, tawk.to's knowledge base article editor does not support Markdown. Instead, it uses a block-based rich-text editor for creating articles</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes, it does, in the form of rich text formatting via UI (like Microsoft Word)</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>Tawk.to is free for use but you retain Tawk.to's branding and marketing. You also do have to pay $39/mo if you'd like to use a custom domain for the KBS. AI features are charged separately.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>No.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>Onboarding for tawk.to is straightforward. I registered an account, and I was asked which product I wanted to set up first. I chose the Knowledge Base product. I was asked to pick a custom subdomain, then poof I was in the Knowledge Base's dashboard. Thereafter, I could create a category or an article. Straightforward.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>While Tawk.to has an AI feature known as Apollo AI, it does not seem to support AI searches of the knowledge base. At least based on the public documentation that I have read so far.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>No, tawk.to does not support SSO. Tawk.to is not enterprise-ready.</p>
<blockquote>
<p>Does it allow the user to customize theming via CSS?</p>
</blockquote>
<p>Unfortunately, tawk.to does not allow the user to theme their knowledge base with custom CSS. What they support is for you to upload a favicon and logo, set primary colors and fonts and customize the layout of the knowledge base.</p>
<h3 id="rating-tawkto">Rating Tawk.to</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>Nothing beats free and tawk.to is free. Custom domains and AI features are chargeable though, and they are fairly priced.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐ (1/5)</td>
<td>Tawk.to is buggy, and it lacks SSO.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>Tawk.to's Apollo AI is very much focused on the live chat features instead of the knowledge base. The knowledge base might or might not be a source of knowledge for the live chat's AI suggestions/replies. That said, it does seem to be well thought out. But it is a new feature. You should test this out yourself and see if it is good enough for you.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>Simple and easy to use UI. No negative comments here. It just needs to be less buggy.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐ (3/5)</td>
<td>Tawk.to's API is half-baked. It offers a webhook API for notification purposes, including various Zapier/Make integrations. What it does not feature is an API to extend the knowledge base software.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (3.4/5)</td>
<td>Tawk.to is a great product for small businesses and startups. But you probably have to switch to another provider as you grow because it lacks Enterprise-y features for a growing/big company even if you can pay for it, such as SSO.</td>
</tr>
</tbody>
</table>
<h2 id="guru">Guru</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐⭐ (2.5/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐ (2/5)</td>
<td>⭐⭐⭐ (5/5)</td>
<td>⭐⭐⭐ (3.4/5)</td>
</tr>
</tbody>
</table>
<p>Guru looks like a wiki, acts like a wiki, and behaves like a wiki for non-tech savvy people. In my opinion, Guru is a glorified wiki with integrations and a pretty UI. It brands itself as the single source of truth of internal business knowledge. And I can imagine that to be true, if you are not very tech-savvy.</p>
<p>However, as a serial entrepreneur, I'm not sure it is smart to place secrets, internal discussions, and anything proprietary into a 3rd-party platform which might hold you hostage unless you cough up more money. Like what Slack, Gitlab, or Google Workspace has done to us before. That said, I'd say Guru is a pretty slick wiki product.</p>
<h3 id="guru-demo">Guru Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const SLIDES_CONFIG = [
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/1.png",
        title: "Guru's Landing Page",
        description: "Guru says it is an AI source of truth. Yet another company that has leaned into AI in the post-ChatGPT world."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/2.png",
        title: "User Registration",
        description: "I registered an account."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/3.png",
        title: "Email Verification",
        description: "Then I was asked to verify my email."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/4.png",
        title: "Workspaces",
        description: "What I did not understand is that I was asked to switch workspaces. I mean, obviously I have none. Why couldn't it create one for me? Anyways, I created one and was brought to the dashboard."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/5.png",
        title: "Dashboard",
        description: "This is what Guru's dashboard looks like."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/6.png",
        title: "Create New Page",
        description: "I created a new page named \"Testing\" and published it."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/7.png",
        title: "Knowledge Base Article UI",
        description: "This is what a published Guru article looks like."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/8.png",
        title: "Knowledge Base Article UI P2",
        description: "I scrolled it down and this is how it looks."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/9.png",
        title: "Billing",
        description: "As you can see, it is NOT cheap. $3000/year. My god."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/10.png",
        title: "Integrations",
        description: "One of the angles that Guru sells hard is its integrations. You can see that it has a bunch of integrations."
      },
      {
        image: "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/guru/11.png",
        title: "Integrations P2",
        description: "More Integrations!"
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="guru-product-questions-answered">Guru Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Unlike most other KBs mentioned above which are largely customer-oriented, Guru sits comfortably in the category of being a KBS that serves to document <strong>business knowledge</strong> for <strong>internal use</strong>. Especially since it brands itself as the <em>AI source of truth</em>.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>50/50. Guru does support markdown editing within content blocks of a page editor. The editor for content is similar to a WYSIWYG page editor. Personally, I abhor such editors. Content should just be Markdown documents or rich text, and nothing more.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes, but in a WYSIWYG manner.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>$25/seat/month.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>You register an account, and then you're brought to a Slack-like interface for which instead of chats, you get webpages with content; for which you can post/edit/delete pages.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, Guru supports SSO. It uses SAML 2.0 standard for SSO connections.</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>No, getguru.com does not support theming via custom CSS. Instead, it offers more limited, built-in branding options controlled by an administrator through the Workspace Preferences settings</p>
<h3 id="rating-guru">Rating Guru</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐⭐ (2.5/5)</td>
<td>I am going to be honest. I don't like seat-based charging but I understand why SaaS do that. It's a fair way to charge more to companies that are bigger and likely to be able to afford it. Guru's offering is simple. An internal wiki with integrations and AI, but I'm not sure it is worth $25/seat/month.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>I'm honestly not very sure what Guru is trying to offer. It brands itself to be an Enterprise-ready wiki for internal users, so it is obviously targeted towards larger companies. However, I cannot imagine a larger company trusting its proprietary knowledge to sit on a 3rd-party platform. That said, it does support Enterprise features.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>AI is well integrated into Guru. What sets it apart is a form of AI-based search known as RAG (retrieval-augmented generation) for the knowledge base; which seems to serve the internal users instead of customers.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐ (2/5)</td>
<td>This is subjective, but I find the general design all great, until it comes to the WYSIWYG editing of the page content, which is both obtrusive and hard to use. I feel like it is complexity for the sake of complexity.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐⭐ (5/5)</td>
<td>Guru has a comprehensive REST API that allows developers to programmatically access and manage a team's knowledge. It is a key part of Guru's Developer Network, which also offers webhooks and a Python SDK for building integrations and automating workflows.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (3.4/5)</td>
<td>I am going to be honest. I'd not recommend using Guru for storing your company's internal wiki for two reasons:<br>1. You should not grow with your proprietary knowledge stuck in another platform.<br>2. You should not be paying $25/employee/month. No wiki is worth that much.<br><br>Self-host something simple instead.</td>
</tr>
</tbody>
</table>
<h2 id="slite">Slite</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐⭐ (2.5/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐ (2/5)</td>
<td>⭐⭐⭐ (5/5)</td>
<td>⭐⭐⭐ (3.4/5)</td>
</tr>
</tbody>
</table>
<p>Slite is a business wiki for internal use. It is a lot like Guru, except that it gets content editing right -- It offers a Markdown-first experience with optional UI rich-text editing. On top of that, the AI integration is done better than Guru. With a tagline that says "Where knowledge <s>goes to die</s> thrives", it is selling its AI (RAG) search for which I believe is modern search done right.</p>
<h3 id="slite-demo">Slite Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const SLITES_IMAGE_BASE = "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/slite/";
    const SLIDES_CONFIG = [
      {
        image: SLITES_IMAGE_BASE + "1.png",
        title: "Slite",
        description: "Where knowledge <s>goes to die</s> thrives"
      },
      {
        image: SLITES_IMAGE_BASE + "2.png",
        title: "User Registration",
        description: "I registered an account with my work email."
      },
      {
        image: SLITES_IMAGE_BASE + "3.png",
        title: "Account Survey",
        description: "Right after registration, I was asked to fill out a survey to tell Slite how big my company is, and our intentions with Slite. I guess it is to provide enough data to prioritize our account with Slite's sales representatives."
      },
      {
        image: SLITES_IMAGE_BASE + "4.png",
        title: "Team Invite",
        description: "The next step of the onboarding journey was to ask me to invite my team. It did not really make sense to me because why would I invite any of my teammates until I understand how well the product works for me?"
      },
      {
        image: SLITES_IMAGE_BASE + "5.png",
        title: "Product Tour",
        description: "Next, I was given a product tour. I skipped it like any ADHD nerd."
      },
      {
        image: SLITES_IMAGE_BASE + "6.png",
        title: "Dashboard",
        description: "I was shown a dashboard with some placeholder data. I learned that a channel is like a \"folder\" that holds articles. A channel can be public or private."
      },
      {
        image: SLITES_IMAGE_BASE + "7.png",
        title: "Templates",
        description: "There are also ready-made document templates which I could leverage, or create my own."
      },
      {
        image: SLITES_IMAGE_BASE + "8.png",
        title: "Channels",
        description: "I tried to create a public channel."
      },
      {
        image: SLITES_IMAGE_BASE + "9.png",
        title: "Roles",
        description: "And I could invite people to access the channel."
      },
      {
        image: SLITES_IMAGE_BASE + "10.png",
        title: "Editor",
        description: "The editor looks like Ghost's article editor. And that's a compliment. Looks good."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="slite-product-questions-answered">Slite Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Slite is a KBS intended to document business knowledge. It looks and behaves very much like a wiki.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>Yes! Markdown is native on Slite.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Because Markdown is native on Slite, code snippets are very well supported with the ` character.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>Prices start from $8/seat/month and it includes AI search.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>Onboarding is straightforward. You register an account, then you are asked for your team size (probably for their sales team). Then you are asked to invite your teammates. You are then dropped into the Slite's dashboard which is really the home of the wiki.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, if you go up to their $20/user/month plan.</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>No, Slite does not allow users to customize their wiki or documentation with custom CSS. The platform is designed for a streamlined and minimalist aesthetic and keeps customization options limited to maintain a consistent user experience.</p>
<h3 id="rating-slite">Rating Slite</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Even though Slite charges by seat, I have to say that Slite prices itself fairly. $20/seat/month for SSO, $8 if you don't need SSO or the other enterprise-y stuff. Very fair.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Slite is Enterprise-ready. My concerns with Slite remain the same with Guru, even though it is fairly priced. It is that if you are a growing business, why would you keep your product knowledge with a 3rd-party that might die any day if it does not make enough money or gets itself sued. Worst, the product gets hacked and is entirely out of your control. That said, I also understand the flip side of the equation for which you are a growing business and you want to focus on what matters -- growing the business and nothing more. In this case, by all means go with Slite. I think it is Enterprise ready and it is why I give it a rating of 4.5/5.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>AI is native on Slite. Well-integrated!</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Slite looks well-designed and slick!</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Yes, Slite has a REST API that allows you to automate tasks and build custom integrations with your knowledge base.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Slite is very well-done as an internal wiki for internal business knowledge documentation. My concerns with Slite remain the same as with Guru. If you are a growing company, why would you trust a 3rd-party site to manage the security and sanctity of your proprietary business knowledge?</td>
</tr>
</tbody>
</table>
<h2 id="helpjuice">Helpjuice</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐ (1/5)</td>
<td>⭐⭐⭐ (3/5)</td>
<td>⭐⭐⭐ (3.5/5)</td>
<td>⭐⭐⭐ (3.5/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐ (3.1/5)</td>
</tr>
</tbody>
</table>
<p>Helpjuice is the worst KBS product out of everything I have tested. In my opinion -- Helpjuice has a minimal feature set, and is ridiculously mispriced <em>and</em> overpriced, and worst of all, it is buggy. As an engineer, it also seems to be a sales-led company with part of the onboarding getting you to book a call with their sales representatives. Nothing wrong with that except that it gives the engineer in me the ick.</p>
<h3 id="helpjuice-demo">Helpjuice Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const HELPJUICE_IMAGE_BASE = "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/helpjuice/";
    const SLIDES_CONFIG = [
      {
        image: HELPJUICE_IMAGE_BASE + "1.png",
        title: "Helpjuice",
        description: "Helpjuice wants to be the ultimate Knowledge Base Software trying to straddle between customer-facing help center vs. internal-use wiki"
      },
      {
        image: HELPJUICE_IMAGE_BASE + "2.png",
        title: "Registration",
        description: "After registering an account, I was asked to verify my email."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "3.png",
        title: "Knowledge Base Setup",
        description: "I was asked if I wanted to import an existing knowledge base, or start from scratch. Cool, because it means that it will crawl a knowledge base and copy it over to Helpjuice. I chose to start from scratch."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "4.png",
        title: "Access Type",
        description: "I was then asked to choose the access type: if I wanted to open it to the public, or keep it private for employees, or both."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "5.png",
        title: "Layout",
        description: "And to choose a layout."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "6.png",
        title: "Book a call with a Sales Rep",
        description: "Helpjuice is pushing me to book a call with a sales rep with various dark patterns, like claiming it is a consulting session that costs $500. Not a good look."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "7.png",
        title: "Knowledge Base Tour",
        description: "Next, I was given a tour of what the knowledge base will look like."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "8.png",
        title: "Dashboard",
        description: "A view of the dashboard to work with the knowledge base. Looks like a wiki."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "9.png",
        title: "Editor",
        description: "What the editor looks like. It supports Markdown somewhat."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "10.png",
        title: "Bug",
        description: "Guess what. After publishing an article and trying to view it in its published link, I got a 404 error page saying it is not found."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "11.png",
        title: "How the Knowledge Base looks like",
        description: "But the knowledge base loads. This is how it looks."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "12.png",
        title: "Editor Options",
        description: "Various versioning options in the editor."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "13.png",
        title: "Pricing plans",
        description: "Plans start from $249/mo."
      },
      {
        image: HELPJUICE_IMAGE_BASE + "14.png",
        title: "Comparing Plans",
        description: "I really don't like Helpjuice's pricing tiers."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="buggy-software">Buggy Software</h3>
<p>In my experience, Helpjuice is plagued with bugs. At the time of testing, the footer of every page links to the API documentation via <code>https://help.helpjuice.com/en_US/api-v3-webhooks/api-v3</code>. However, that was found to be a 404 error page. This is not the only bug, but the one bug that I had jotted down in my testing.</p>
<h3 id="helpjuice-product-questions-answered">Helpjuice Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Superficially, Helpjuice's core use-case seems to be for documentation of product knowledge and various FAQ for customers.</p>
<p>However, it also introduces various user roles and permissions which means the knowledge base can also be used for internal use. Which means a portion of articles can only be viewed when logged in as an employee; and other public articles intended for customers. This is similar to what NinjaPear has with public and private articles. Which is very helpful because regardless of visibility, having a single source of business knowledge is very helpful for AI search.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>Yes, Helpjuice supports Markdown within its page article content block.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>Prices start at $249/mo (!) By far the highest amongst all the platforms I have reviewed. The caveat is that $249/mo grants you 30 seats.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>By and large, yes. Unless you get on the largest plan of $799/mo which grants you <em>unlimited</em> users.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>The onboarding process starts with a user registration and an email verification.</p>
<p>The onboarding process begins step-by-step:</p>
<p>First, you are asked to "import an existing knowledge base" or start from scratch. I am guessing that importing means that Helpjuice would crawl the existing knowledge base to populate their knowledge base with legacy content.</p>
<p>Then you are asked the access type of the knowledge base, for which the user can choose between:</p>
<ul>
<li>Mixed access</li>
<li>External</li>
<li>Internal</li>
</ul>
<p>Next, you'll be asked to choose the layout of the knowledge base.</p>
<p>The next step will be to schedule what I presume is a call with a sales-rep to upsell you to a conversion.</p>
<p>Finally, you'll be shown a tour of the knowledge base.</p>
<p>In my opinion, the onboarding process for HelpJuice has far too many steps.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, it is part of the "Swifty AI" suite.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, Helpjuice supports SSO.</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>Yes, Helpjuice allows users to customize their knowledge base with custom CSS, with a built-in CSS editor. You can even upload your own custom CSS file. All these on top of the pre-built themes.</p>
<h3 id="rating-helpjuice">Rating Helpjuice</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐ (1/5)</td>
<td>Helpjuice has a steep entry-price of $249/mo, with tiered pricing limited by seats. On top of that, it is in my opinion, buggy software.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐ (3/5)</td>
<td>I believe Helpjuice has positioned itself to be very much targeted towards Enterprises with a sales-led approach, as well as various Enterprise requirements such as SSO. However, its buggy software and minimal feature set made me doubt that it is ready for Enterprises beyond just a marketing gimmick.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐ (3.5/5)</td>
<td>There is AI on Helpjuice. That is all I would say.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐ (3.5/5)</td>
<td>Helpjuice design is ok. Not atrocious. Nothing bad, nothing good.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Ok, Helpjuice has a pretty extensive and well-documented API. I will give props where they are due.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐⭐ (3.1/5)</td>
<td>The problem with Helpjuice is that it lacks focus. I'm not sure what it is trying to do, and I think that's their design goal -- to build a KBS that can be for internal documentation, or for public documentation, or a mix of both. Which is what you can see during the onboarding process when you are asked to pick one. In trying to do everything, you end up doing nothing. I would not recommend Helpjuice to anyone.</td>
</tr>
</tbody>
</table>
<h2 id="helpscout">HelpScout</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐ (2/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐ (3.8/5)</td>
</tr>
</tbody>
</table>
<p>HelpScout is an interesting product in that it flips the script against charging the product by seats, but by contacts instead. Both angles are to tax you by growth.</p>
<p>Beyond that, HelpScout is a platform with quite a bit of features, with the focus on customer support. The HelpScout platform has a shared inbox, a live chat, a knowledge base software, a messaging/survey product. The quirk is that while it ticks the checkboxes, each of these features are very minimal in depth. And you can see that in effect with HelpScout's KBS.</p>
<p>HelpScout is also pretty buggy during my time in testing.</p>
<h3 id="helpscout-demo">HelpScout Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const HELPSCOUT_IMAGE_BASE = "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/helpscout/";
    const SLIDES_CONFIG = [
      {
        image: HELPSCOUT_IMAGE_BASE + "1.png",
        title: "HelpScout",
        description: "HelpScout's unique angle here is that they offer Unlimited Seats (and charge for contacts instead)."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "2.png",
        title: "Account Registration",
        description: "I registered an account."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "3.png",
        title: "Account Registration Fail",
        description: "But it failed, not once, but persistently! I had to change to another email before it <b>worked</b>."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "4.png",
        title: "Captcha",
        description: "I don't understand why Captcha needs to be a separate page. But I solved it."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "5.png",
        title: "Survey",
        description: "I <b>was</b> asked about my company size and industry, as well as how I found out about them. Typical questions to see if they would need to prioritize this account."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "6.png",
        title: "Survey P2",
        description: "More questions about how we intend to use the product."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "7.png",
        title: "Ticket Inbox Dashboard",
        description: "After the registration flow, I <b>was</b> dropped into the ticketing inbox dashboard. I guess that's what <b>HelpScout</b> is focused on, customer support via tickets."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "8.png",
        title: "Docs",
        description: "I clicked into the Knowledge Base page by clicking on the \"Docs\". I <b>could</b> create articles or categories."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "9.png",
        title: "New Article",
        description: "Here, I tried to create and publish my first article."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "10.png",
        title: "Error Page",
        description: "I published the article and tried to visit the public link to the article, but I got an error page. Bug."
      },
      {
        image: HELPSCOUT_IMAGE_BASE + "11.png",
        title: "Dashboard",
        description: "How the dashboard looks after the article was published."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="helpscout-product-questions-answered">HelpScout Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>HelpScout's KBS is oriented towards customers, for documenting product knowledge and FAQ. Much like every other customer support platform out there.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>Yes, Help Scout's knowledge base editor supports standard Markdown syntax for formatting articles. While you can use a rich-text editor with toolbars, you also have the option to apply formatting by typing Markdown shortcuts directly.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>There is a free plan which grants you to contact up to 100 contacts per month. And a standard plan stating at $50/mo which gives you 100 contacts per month with the option to scale. But guess what, these are pricing for its live chat feature.</p>
<p>If you plan to use just its knowledge base feature, then it is <em>free</em>!</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>No.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>The onboarding process was pretty buggy. First, I registered an account with my work email but then I got an error. I had to try another email before that error went away.</p>
<p>I was then asked to describe my company, industry, company size, etc. Pretty standard although I don't know why the survey needs to be spread over two pages.</p>
<p>I was then brought to a ticket inbox dashboard page. This is when you realised HelpScout is really not a KBS but a customer support suite with a bolted-on KBS.</p>
<p>Then I clicked over to "Docs" and I could either create a category or an article.</p>
<p>I tried to create an article, published it, only to get an error page.</p>
<p>Honestly not the best onboarding experience. Great landing page though.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, Help Scout has an AI Search feature called AI Answers. It is an AI-powered chatbot that uses your knowledge base articles to provide instant, conversational answers to customer questions via the Beacon help widget.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, HelpScout supports SSO.</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>Yes, Help Scout allows for extensive customization of its Docs knowledge base theme using CSS. You can either upload a stylesheet or enter CSS directly into the Custom Code section of your Docs settings.</p>
<h3 id="rating-helpscout">Rating HelpScout</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>4/5 because it is essentially free if you're just looking to use their KBS feature. However, if you are looking to use their other products, then you might hit their contact limit and might end up having to pay. That said, their prices look fair and you simply pay more if you have more contacts (which really means more customers).</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐ (2/5)</td>
<td>While HelpScout has various features required for Enterprises such as SSO, its minimal feature set and buggy platform makes it not very palatable for Enterprises to adopt HelpScout.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>HelpScout has AI integration through its platform.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>I think HelpScout's UI is well-designed and the dashboard is easy to navigate. -0.5 because of the extensive onboarding survey spread over two pages.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Help Scout has a robust developer platform with several APIs and tools for integrating with other applications and customizing functionality.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐ (3.8/5)</td>
<td>HelpScout is OK as a customer support platform. Meh if you're considering it as a KBS. There are better alternatives in almost every aspect from UI, product stability, pricing, features, etc.</td>
</tr>
</tbody>
</table>
<h2 id="freshdesk">Freshdesk</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐⭐⭐ (/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐ (3/5)</td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐ (3.8/5)</td>
</tr>
</tbody>
</table>
<p>Freshdesk is a straightforward product. With the quirk in that it has a ticketing system built alongside the knowledge base. That means customers can create new tickets from the public knowledge base's interface. This is because Freshdesk is first and foremost a ticketing system, with every other feature built to augment their ticketing system.</p>
<h3 id="freshdesk-demo">Freshdesk Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const FRESHDESK_IMAGE_BASE = "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/freshdesk/";
    const SLIDES_CONFIG = [
      {
        image: FRESHDESK_IMAGE_BASE + "1.png",
        title: "Freshdesk",
        description: "The landing page of Freshdesk. I've always known about Freshdesk and their name being very similar to Zendesk is not a coincidence. They are an Indian company which tried very hard to compete with Freshdesk."
      },
      {
        image: FRESHDESK_IMAGE_BASE + "2.png",
        title: "User Registration",
        description: "I signed up for an account on Freshdesk with my work email. Take note that I was not asked to fill in a password."
      },
      {
        image: FRESHDESK_IMAGE_BASE + "3.png",
        title: "Survey",
        description: "As usual in sales-led companies, I had to fill out a survey on my company size, industry and my experience level."
      },
      {
        image: FRESHDESK_IMAGE_BASE + "4.png",
        title: "Dashboard",
        description: "After registration, I was brought to the dashboard where I was asked to connect my support email. Although my focus here is on the Knowledge Base."
      },
      {
        image: FRESHDESK_IMAGE_BASE + "5.png",
        title: "Knowledge Base Dashboard",
        description: "So I clicked on the icon that looks like a book, and I was brought to the Knowledge Base dashboard page, where the primary call to action was to create a new article."
      },
      {
        image: FRESHDESK_IMAGE_BASE + "6.png",
        title: "Editor",
        description: "I created a simple article but I couldn't publish it until I verified my account."
      },
      {
        image: FRESHDESK_IMAGE_BASE + "7.png",
        title: "Email Verification",
        description: "I checked my email and followed the email verification link, where I was asked to enter a password for the account and activate my account."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="freshdesk-product-questions-answered">Freshdesk Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Freshdesk's KBS use-case is intended to document product knowledge and FAQs for customers.</p>
<blockquote>
<p>Does it support markdown?</p>
</blockquote>
<p>No, Freshdesk does not natively support Markdown in its knowledge base article editor. Instead, it uses a rich text editor (also known as a WYSIWYG editor) for formatting articles.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>It does, via the WYSIWYG editor when you select a code block</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>Freshdesk pricing starts from $15/agent/month. AI usage is charged separately. Prices can go as high as to $79/agent/month.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>Freshdesk's onboarding starts with a user registration without any password input. Thereafter, you have to activate your account after registering which includes quite a long process of password input, inputting your company size and type, etc.</p>
<p>Upon login, you are brought to the tickets dashboard. What I did was to navigate to the "Solutions" tab, which is essentially their KBS.</p>
<p>From which I attempted to publish a simple "hello world" article. That was when it became really jarring because first I have to select a "hierarchy" folder and then a "category" for which I simply cannot understand why these two entities need to exist. I guess to form a multi-level folder structure?</p>
<p>After account activation and creation of a category <em>and</em> a hierarchy, then I could have the hello world <a href="https://ninjapear.freshdesk.com/support/solutions/articles/159000415432-hello-world?ref=nubela.co">published</a>.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, Freshdesk provides AI search capabilities for its knowledge base through its native AI engine, Freddy AI.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes, Freshdesk fully supports Single Sign-On (SSO).</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>Yes, Freshdesk allows users to customize the theming of their Knowledge Base using CSS through an advanced code editor. You can access this editor to apply custom CSS and make changes to the layout and appearance of your entire customer portal, including the Knowledge Base section.</p>
<h3 id="rating-freshdesk">Rating Freshdesk</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐⭐⭐ (3/5)</td>
<td>Not the cheapest, nor the most expensive. Average prices.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Freshdesk works. It's not buggy, it has Enterprise features, and it has a ticketing system which large enterprise-y companies love.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐ (3/5)</td>
<td>Freshdesk has Freddy AI bolted on which seems to be well integrated.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐⭐⭐⭐ (4/5)</td>
<td>Freshdesk's UI looks ok, if not slightly dated. I am able to easily navigate within Freshdesk so that's a huge win that most products can't even accomplish.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Yes, Freshdesk does have an API that allows developers to access and manage help desk data programmatically.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐ (3.8/5)</td>
<td>Freshdesk is a firm contender against its other customer-service oriented platforms. That said, it is not the best. Near the best, but not the best.</td>
</tr>
</tbody>
</table>
<h2 id="zendesk">Zendesk</h2>
<table>
<thead>
<tr>
<th><strong>Pricing</strong></th>
<th><strong>Enterprise Ready</strong></th>
<th><strong>AI Integration</strong></th>
<th><strong>Design</strong></th>
<th><strong>Extensibility</strong></th>
<th><strong>Average</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>⭐ (1/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐⭐ (3/5)</td>
<td>⭐ (1/5)</td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>⭐⭐ (2.8/5)</td>
</tr>
</tbody>
</table>
<p>Zendesk is a customer support platform not unlike Freshdesk or Intercom which happens to offer a KBS.</p>
<p>Firstly, I really wanted to like Zendesk because it acquired and absorbed a similar startup from Singapore so I had high hopes for it.</p>
<p>Unfortunately it is a really slow site at the time of testing. I mean, it <em>crawls</em> from my office internet in Singapore. One part of the onboarding process was to create a mock knowledge base and it literally took <em>minutes</em>. This is hardcoded mock data! It does not take minutes to insert it into a database. It reeks of poor developer culture.</p>
<p>On top of that, its onboarding form's UX is terrible and inefficient with one field per page. On top of that, it is <strong>super expensive</strong>. I really don't understand why anyone would want to use Zendesk other than legacy.</p>
<h3 id="zendesk-demo">Zendesk Demo</h3>

<!--kg-card-begin: html-->
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      .onboarding-widget-wrapper {
        position: relative;
        width: 100%;
        height: 600px;
        border-radius: 8px;
        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
        overflow: hidden;
      }

      .onboarding-widget {
        position: relative;
        width: 100%;
        height: 100%;
        overflow-y: scroll;
        overflow-x: hidden;
        background: #1a1a1a;
        scroll-snap-type: y mandatory;
        scroll-behavior: smooth;
        -webkit-overflow-scrolling: touch;
      }

      .onboarding-scene {
        position: relative;
        width: 100%;
        height: 600px;
        flex-shrink: 0;
        scroll-snap-align: start;
        scroll-snap-stop: always;
      }

      .screenshot-container {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1a1a1a;
        position: relative;
      }

      .screenshot-container img {
        width: 100%;
        height: 100%;
        object-fit: contain;
      }

      .scene-description {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        background: linear-gradient(
          to top,
          rgba(0, 0, 0, 0.85) 0%,
          rgba(0, 0, 0, 0.7) 70%,
          transparent 100%
        );
        backdrop-filter: blur(8px);
        padding: 60px 30px 30px 30px;
        text-align: center;
      }

      .scene-description .title {
        font-size: 1.5rem;
        color: #ffffff;
        margin-bottom: 8px;
        font-weight: 600;
        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
      }

      .scene-description .description {
        font-size: 0.95rem;
        line-height: 1.5;
        color: #e0e0e0;
        max-width: 800px;
        margin: 0 auto;
        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      }

      /* Scroll Indicators */
      .scroll-indicators {
        position: absolute;
        right: 20px;
        top: 50%;
        transform: translateY(-50%);
        display: flex;
        flex-direction: column;
        gap: 12px;
        z-index: 100;
        pointer-events: none;
      }

      .scroll-indicators .scroll-dot {
        pointer-events: auto;
      }

      .scroll-dot {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        background: #d0d0d0;
        cursor: pointer;
        transition: all 0.3s ease;
        border: 2px solid transparent;
      }

      .scroll-dot:hover {
        background: #a0a0a0;
        transform: scale(1.2);
      }

      .scroll-dot.active {
        background: #4a90e2;
        border-color: #4a90e2;
        box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.2);
      }

      /* Scene Counter and Navigation */
      .scene-navigation {
        position: absolute;
        top: 20px;
        left: 50%;
        transform: translateX(-50%);
        display: flex;
        align-items: center;
        gap: 12px;
        z-index: 100;
      }

      /* Open Image Button */
      .open-image-button {
        position: absolute;
        top: 20px;
        right: 20px;
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        z-index: 100;
      }

      .open-image-button:hover {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .open-image-button svg {
        width: 20px;
        height: 20px;
        fill: #333;
      }

      .nav-button {
        width: 36px;
        height: 36px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        border: 2px solid rgba(255, 255, 255, 0.3);
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.3s ease;
        backdrop-filter: blur(10px);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
      }

      .nav-button:hover:not(:disabled) {
        background: rgba(255, 255, 255, 1);
        transform: scale(1.1);
        box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4), 0 3px 6px rgba(0, 0, 0, 0.3);
      }

      .nav-button:disabled {
        opacity: 0.4;
        cursor: not-allowed;
      }

      .nav-button svg {
        width: 16px;
        height: 16px;
        fill: #333;
      }

      .scene-counter {
        background: rgba(255, 255, 255, 0.95);
        color: #333;
        padding: 8px 16px;
        border-radius: 20px;
        font-size: 0.9rem;
        backdrop-filter: blur(10px);
        pointer-events: none;
        border: 2px solid rgba(255, 255, 255, 0.3);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
        font-weight: 600;
      }

      /* Mobile Responsive */
      @media (max-width: 768px) {
        .scene-description {
          padding: 40px 20px 20px 20px;
        }

        .scene-description .title {
          font-size: 1.2rem;
        }

        .scene-description .description {
          font-size: 0.85rem;
          line-height: 1.4;
        }

        .scroll-indicators {
          right: 10px;
        }

        .scroll-dot {
          width: 10px;
          height: 10px;
        }

        .nav-button {
          width: 32px;
          height: 32px;
        }

        .nav-button svg {
          width: 14px;
          height: 14px;
        }

        .scene-counter {
          font-size: 0.8rem;
          padding: 6px 12px;
        }

        .scene-navigation {
          top: 15px;
          gap: 8px;
        }

        .open-image-button {
          width: 36px;
          height: 36px;
          top: 15px;
          right: 15px;
        }

        .open-image-button svg {
          width: 18px;
          height: 18px;
        }
      }
</style>

<div class="onboarding-widget-wrapper" data-onboarding-widget>
  <div class="onboarding-widget">
    <!-- Scenes will be dynamically generated here -->
  </div>

  <!-- Scroll Indicators -->
  <div class="scroll-indicators"></div>

  <!-- Open Image Button -->
  <button class="open-image-button" aria-label="Open image in new tab">
    <svg viewBox="0 0 24 24">
      <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
    </svg>
  </button>

  <!-- Scene Navigation -->
  <div class="scene-navigation">
    <button class="nav-button nav-button-prev" aria-label="Previous slide">
      <svg viewBox="0 0 24 24">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
      </svg>
    </button>
    <div class="scene-counter">1 / 1</div>
    <button class="nav-button nav-button-next" aria-label="Next slide">
      <svg viewBox="0 0 24 24">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
      </svg>
    </button>
  </div>
</div>

<script>
  (function() {
    // ========================================
    // CONFIGURATION - Edit your slides here!
    // ========================================
    const ZENDESK_IMAGE_BASE = "https://ninjapear-pub.sfo3.cdn.digitaloceanspaces.com/ninjapear_kbs_review_screenshots/zendesk/";
    const SLIDES_CONFIG = [
      {
        image: ZENDESK_IMAGE_BASE + "1.png",
        title: "Zendesk",
        description: "Zendesk has been a veteran in the customer support space."
      },
      {
        image: ZENDESK_IMAGE_BASE + "2.png",
        title: "User Registration",
        description: "I like their registration page. Only 1 field, and it makes me see the dashboard in the background which I love and makes me want to get to it ASAP."
      },
      {
        image: ZENDESK_IMAGE_BASE + "3.png",
        title: "Registration Flow",
        description: "I was asked for a job title. Ok, I don't like this. I prefer all the fields on one page. But that might just be me."
      },
      {
        image: ZENDESK_IMAGE_BASE + "4.png",
        title: "Registration Flow P3",
        description: "I was asked what product I want to try. I chose the \"Customer Service\"."
      },
      {
        image: ZENDESK_IMAGE_BASE + "5.png",
        title: "Registration Flow P4",
        description: "I'm asked to verify my email, which I did."
      },
      {
        image: ZENDESK_IMAGE_BASE + "6.png",
        title: "Product Tour and Onboarding",
        description: "I never liked Product Tour. In this case, they are showcasing their AI features."
      },
      {
        image: ZENDESK_IMAGE_BASE + "7.png",
        title: "Onboarding P2",
        description: "I was then asked to invite my team. I'd prefer to try out the product first, decide that it is good, before I invite my colleagues into a product."
      },
      {
        image: ZENDESK_IMAGE_BASE + "8.png",
        title: "Onboarding P3",
        description: "This felt a bit weird. Zendesk wants us to test out AI inferencing with some background knowledge and asked us to provide that to them. Weird. Where do I even start?"
      },
      {
        image: ZENDESK_IMAGE_BASE + "9.png",
        title: "Onboarding P4",
        description: "Then I'm asked to connect my email. Not of interest because my focus is on the Knowledge Base."
      },
      {
        image: ZENDESK_IMAGE_BASE + "10.png",
        title: "Onboarding P5",
        description: "I'm asked to solve a test ticket. Not relevant since my focus is on the knowledge base."
      },
      {
        image: ZENDESK_IMAGE_BASE + "11.png",
        title: "Onboarding P6",
        description: "Ugh this is getting draggy. More product tour."
      },
      {
        image: ZENDESK_IMAGE_BASE + "12.png",
        title: "Knowledge Base Dashboard",
        description: "Finally, we're on the Knowledge Base. I chose to \"Start from scratch\"."
      },
      {
        image: ZENDESK_IMAGE_BASE + "13.png",
        title: "Knowledge Base UI",
        description: "How the base Knowledge Base UI looks"
      },
      {
        image: ZENDESK_IMAGE_BASE + "14.png",
        title: "Editor",
        description: "How the editor looks. Looks good. And no I don't want another tour. I created and published a test article."
      },
      {
        image: ZENDESK_IMAGE_BASE + "15.png",
        title: "Knowledge Base Article",
        description: "After publishing the article, this is how the article looks."
      },
      {
        image: ZENDESK_IMAGE_BASE + "16.png",
        title: "Editor Article Settings",
        description: "Here you can see how you can add extra metadata/visibility settings to an article."
      }
    ];
    // ========================================
    // End of configuration
    // ========================================

    // Find the current script's previous sibling (the widget wrapper)
    const currentScript = document.currentScript;
    const widgetWrapper = currentScript.previousElementSibling;

    if (!widgetWrapper || !widgetWrapper.hasAttribute('data-onboarding-widget')) {
      console.error('Onboarding widget wrapper not found');
      return;
    }

    // Get elements within this specific widget instance
    const widget = widgetWrapper.querySelector(".onboarding-widget");
    const indicatorsContainer = widgetWrapper.querySelector(".scroll-indicators");
    const sceneCounter = widgetWrapper.querySelector(".scene-counter");
    const prevButton = widgetWrapper.querySelector(".nav-button-prev");
    const nextButton = widgetWrapper.querySelector(".nav-button-next");
    const openImageButton = widgetWrapper.querySelector(".open-image-button");

    let currentScene = 0;

    // Generate slides from configuration
    function generateSlides() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const sceneDiv = document.createElement("div");
        sceneDiv.className = "onboarding-scene";
        sceneDiv.setAttribute("data-scene", index + 1);

        sceneDiv.innerHTML = `
          <div class="screenshot-container">
            <img src="${slide.image}" alt="${slide.title}" />
            <div class="scene-description">
              <p class="title">${slide.title}</p>
              <p class="description">${slide.description}</p>
            </div>
          </div>
        `;

        widget.appendChild(sceneDiv);
      });
    }

    // Generate scroll indicator dots
    function generateIndicators() {
      SLIDES_CONFIG.forEach((slide, index) => {
        const dot = document.createElement("div");
        dot.className = "scroll-dot";
        dot.setAttribute("data-scene", index);

        dot.addEventListener("click", () => {
          scrollToScene(index);
        });

        indicatorsContainer.appendChild(dot);
      });
    }

    // Initialize the widget
    generateSlides();
    generateIndicators();

    const scenes = widgetWrapper.querySelectorAll(".onboarding-scene");
    const dots = widgetWrapper.querySelectorAll(".scroll-dot");

    // Function to get current image source
    function getCurrentImageSrc() {
      const currentSceneElement = scenes[currentScene];
      const img = currentSceneElement.querySelector("img");
      return img ? img.src : null;
    }

    // Function to update indicators and navigation buttons
    function updateIndicators(index) {
      currentScene = index;

      // Update dots
      dots.forEach((dot, i) => {
        dot.classList.toggle("active", i === index);
      });

      // Update counter
      sceneCounter.textContent = `${index + 1} / ${scenes.length}`;

      // Update navigation buttons
      prevButton.disabled = index === 0;
      nextButton.disabled = index === scenes.length - 1;
    }

    // Function to scroll to a specific scene
    function scrollToScene(index) {
      if (index < 0 || index >= scenes.length) {
        return;
      }

      const targetScene = scenes[index];
      targetScene.scrollIntoView({ behavior: "smooth", block: "start" });
    }

    // Detect which scene is currently in view based on scroll position
    function detectCurrentScene() {
      const scrollTop = widget.scrollTop;
      const sceneHeight = scenes[0].offsetHeight;
      const newScene = Math.round(scrollTop / sceneHeight);

      if (
        newScene !== currentScene &&
        newScene >= 0 &&
        newScene < scenes.length
      ) {
        updateIndicators(newScene);
      }
    }

    // Listen to scroll events to update indicators
    let scrollTimeout;
    widget.addEventListener(
      "scroll",
      () => {
        clearTimeout(scrollTimeout);
        scrollTimeout = setTimeout(() => {
          detectCurrentScene();
        }, 100);
      },
      { passive: true }
    );

    // Navigation button event listeners
    prevButton.addEventListener("click", () => {
      if (currentScene > 0) {
        scrollToScene(currentScene - 1);
      }
    });

    nextButton.addEventListener("click", () => {
      if (currentScene < scenes.length - 1) {
        scrollToScene(currentScene + 1);
      }
    });

    // Open image in new tab
    openImageButton.addEventListener("click", () => {
      const imageSrc = getCurrentImageSrc();
      if (imageSrc) {
        window.open(imageSrc, "_blank");
      }
    });

    // Initialize first scene indicators
    updateIndicators(0);
  })();
</script>

<!--kg-card-end: html-->
<h3 id="zendesk-product-questions-answered">Zendesk Product Questions, Answered</h3>
<blockquote>
<p>What is the KBS core use-case?</p>
</blockquote>
<p>Zendesk's KBS use-case is intended to document product knowledge and FAQs for customers, like Intercom and Freshdesk.</p>
<blockquote>
<p>Does it support Markdown?</p>
</blockquote>
<p>Yes it does.</p>
<blockquote>
<p>Does it support code snippets formatting?</p>
</blockquote>
<p>Yes it does, although weirdly, Markdown's double backtick does not seem to initiate Markdown's code snippet block. So I'm guessing that their editor supports only a subset of Markdown features.</p>
<blockquote>
<p>What is the price?</p>
</blockquote>
<p>Zendesk KBS plans start at $55/agent/month, and goes all the way up to $169/agent/month with AI included.</p>
<blockquote>
<p>Is pricing charged per-seat?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>What is the onboarding like?</p>
</blockquote>
<p>Slow, <strong>many</strong> steps, and confusing UI.</p>
<p>First, I was asked to register an account, for which it was tedious. Then I was brought to the ticketing dashboard. And I had a hard time finding where the knowledge base feature is. I clicked into the Setup Guides, then I saw that there is a separate setup for Knowledge Base. I enabled the Knowledge Base trial, and then I was in a preview of the knowledge base, for which I can create an article.</p>
<blockquote>
<p>Does it have AI search?</p>
</blockquote>
<p>Yes, Zendesk has AI search capabilities for its knowledge base, featuring both generative and semantic search. This allows users to get instant, AI-generated answers to their questions, rather than just a list of article links.</p>
<blockquote>
<p>Does it have SSO?</p>
</blockquote>
<p>Yes.</p>
<blockquote>
<p>Does it allow for the user to customize theming via CSS?</p>
</blockquote>
<p>Yes, Zendesk allows users to customize the theming of their Help Center knowledge base with custom CSS. This capability is available by editing the code of your theme within the Zendesk Guide admin panel, though it is not available on the lowest-tier plans.</p>
<h3 id="rating-zendesk">Rating Zendesk</h3>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>Rating</strong></th>
<th><strong>Details</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pricing</strong></td>
<td>⭐ (1/5)</td>
<td>Too expensive for features that are confusing to use.</td>
</tr>
<tr>
<td><strong>Enterprise Ready</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Zendesk has Enterprise customers and is one of the giants in the customer support space. It is Enterprise ready.</td>
</tr>
<tr>
<td><strong>AI Integration</strong></td>
<td>⭐⭐⭐ (3/5)</td>
<td>Zendesk has AI integrations but they are bolted on and not well-integrated.</td>
</tr>
<tr>
<td><strong>Design</strong></td>
<td>⭐ (1/5)</td>
<td>Zendesk has a great UI but poor UX. Things look beautiful but they clearly do not think through how a user feels or experiences the UI. I'd guess that the entire product is designed by committee instead of by a singular UI/UX dictator. Which makes it all over the place. Ticks the boxes but fails the vibe test.</td>
</tr>
<tr>
<td><strong>Extensibility</strong></td>
<td>⭐⭐⭐⭐ (4.5/5)</td>
<td>Yes, Zendesk has an API for integrating and extending its products.</td>
</tr>
<tr>
<td><strong>Average</strong></td>
<td>⭐⭐⭐ (2.8/5)</td>
<td>There are way better alternatives in the customer service space with KBS other than Zendesk. I do not recommend Zendesk.</td>
</tr>
</tbody>
</table>
<h2 id="putting-it-all-together">Putting it all together</h2>
<p>This has been a long read and I hope it serves as an encyclopaedia of knowledge base software when you do need one. And trust me, you ought to use one. I self-host a wiki in my homelab just to document my own personal stuff; let alone for a growing business.</p>
<p>What we know so far is that there are three primary use-cases for a Knowledge Base Software:</p>
<ol>
<li>A KBS to document business knowledge for customers</li>
<li>A KBS to document technical knowledge for customers</li>
<li>A KBS to document business knowledge for internal use</li>
</ol>
<p>There exists HelpJuice which tries to do it for all, but fails at doing it well because it was not focused enough.</p>
<p>If you require a KBS to document business knowledge for internal use, I'd recommend <em>Slite</em>.</p>
<p>If you require a KBS for customer-facing knowledge documentation, I'd highly recommend NinjaPear for its rock-solid simple product with common sense pricing, and Intercom (to a lesser extent) if and only if you need something mature with more years in the market.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing NinjaPear ]]></title>
        <description><![CDATA[ NinjaPear is a **100% free** and **unlimited** customer support suite, offering Live Chat and a Knowledge Base for product teams in SMBs. ]]></description>
        <link>https://nubela.co/blog/introducing-ninjapear/</link>
        <guid isPermaLink="false">68de651a14dc920001fdfad8</guid>
        <category><![CDATA[ ninjapear ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Thu, 02 Oct 2025 20:43:10 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/10/Gemini_Generated_Image_3kw8yw3kw8yw3kw8.png" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">UPDATE 29th January 2026 -- NinjaPear has pivoted to become a data platform. We will share an announcement blog post soon. In the meantime, see <a href="https://nubela.co/?ref=nubela.co" rel="noreferrer">https://nubela.co</a> and give the new NinjaPear a test drive.</div></div><p>After months of rest, followed by heads-down building, I'm happy to share that we're launching <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> today! NinjaPear is a <strong>100% free</strong> and <strong>unlimited</strong> customer support suite, offering Live Chat and a Knowledge Base for product teams in SMBs.</p>
<p>I'll give you three reasons why you should choose NinjaPear instead of Intercom, Zendesk, or Tawk.to (a popular free live chat service). And I say this as a veteran founder who used to make purchasing decisions.</p>
<h2 id="1-truly-unlimited-100-free">1. Truly Unlimited, 100% Free</h2>
<p>You can invite as many team members as you want to NinjaPear. We do not charge per seat.</p>
<p>You can have as many contacts/unique conversations as you want. We do not charge by contacts.</p>
<p>When I say we are truly unlimited and free, I mean it. You see, I'm a technical founder, and I'm going to be honest with you. In this post-LLM world, the equation of build versus buy has very much veered toward <em>build</em> in most companies, simply because it's so easy to hack together a prototype. I mean, a significant number of lines of code in NinjaPear are generated by LLMs. The days of hacking together simple software and charging $9.99 per seat are over.</p>
<p>This is why the <a href="https://en.wikipedia.org/wiki/Unique_selling_proposition?ref=nubela.co">USP</a> of NinjaPear is that we're, in fact, an enterprise AI inference company, masquerading as a customer service suite. We charge customers at a profitable premium for every LLM inference made with our products.</p>
<p>Therefore, to veer the customer toward buying, we are offering these core features for free, without limits. We can do this because we are a post-LLM company, unlike Intercom, Zendesk, etc.</p>
<h2 id="2-open-protocolsapi">2. Open Protocols/API</h2>
<p>I don't want you to ever worry about growing and scaling with NinjaPear. When our product's implementation no longer befits your needs, build on top of it! Make full use of our infrastructure. It's managed and free!</p>
<p>Starting with our live chat's communication protocol, we have made it open and <a href="https://nubela.co/docs/protocol/?ref=nubela.co">properly documented</a>. You can build on top of our APIs and support any platform or business needs you might have.</p>
<p>As a founder, I hate being stuck on any platform (looking at you, Slack/Google Workspace). That's why we open-sourced our protocol APIs so your integration can be ported out anytime you want.</p>
<p>Always remember, the founder (me) is technical. We are a dev company, building for fellow devs, with love.</p>
<h2 id="3-ai-native">3. AI-Native</h2>
<p>We started building NinjaPear this year, around April. I deliberately moved very slowly with AI, waiting for the tech to mature and progress to slow down. For one, the performance of open-weight LLMs is pretty near the bleeding-edge closed models from OpenAI and Anthropic.</p>
<p>As I shared above, the open secret of NinjaPear is that we are, in fact, an AI inference company masquerading as a customer service suite. This is why LLM inferencing is a first-class integration in everything we designed, and not slapped on like with every other pre-ChatGPT customer service company.</p>
<p>I believe in less and more. There are two core points of AI integration in NinjaPear:</p>
<ol>
<li>Auto-replies by Ninja Agents</li>
<li>Inbox AI suggestions in the Inbox</li>
</ol>
<h3 id="ninja-agents">Ninja Agents</h3>
<p>Ninja Agents are AI agents that auto-reply to incoming messages. And they <a href="https://www.youtube.com/watch?v=gAjR4_CbPpQ&ref=nubela.co">perform harder, better, faster, <s>stronger</s></a> than human operators.</p>
<p><strong>Faster</strong> because Ninja Agents already have all the business knowledge gathered in a millisecond: your website, pre-crawled; your curated knowledge base; your past chat conversations.</p>
<p><strong>Better</strong> because they do not have emotions, nor will they make English errors, and they understand most written languages.</p>
<p><strong>Harder</strong> because LLMs don't sleep.</p>
<p>No seriously, Ninja Agents are better customer support agents than humans are.</p>
<h3 id="inbox-ai-suggestions">Inbox AI Suggestions</h3>
<p>Humans like talking to humans. I know, because bots smell like bots. I always know. Personally, I prefer talking to humans. But you know what's better than talking to a human? A human augmented with AI powers. Give them every perk a Ninja Agent has, such as millisecond business knowledge retrieval, throw in LLM-generated suggestions, and let a human wipe that bot smell away.</p>
<hr>
<p>As a serial entrepreneur with two exits under my belt over 12 years now, every product I have launched started off as a solution to a personal pain point. This is the first product that I built that solved numerous pains my previous company had.</p>
<p>The NinjaPear I'm sharing with you stands as a humble first iteration. I want you to know NinjaPear is here to stay, and you will see us make a lot of mistakes along the way, for which I will chronicle each and every lesson I learn here in this blog.</p>
<p>Like every company I've built, NinjaPear will be bootstrapped, so there will not be any unhealthy growth pressure that a VC-backed company would have, which means there will be no bait and switch that might come later. At the same time, because we are bootstrapped and funded by 12 years of past profits/exits, you can be sure we will be relentlessly focused on building a company where the margins make sense for us as a profitable and long-term minded company.</p>
<p>It's good to be back with another product, post-Proxycurl! We learned a lot scaling a bootstrapped company from $0 to $10M ARR. And I look forward to taking those lessons forward with NinjaPear. If you have any questions at all, send us an email to <a href="mailto:hello@nubela.co">hello@nubela.co</a> :) I'll be personally replying to every email.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Proxycurl Shuts Down. Thank you. ]]></title>
        <description><![CDATA[ 💡The team behind Proxycurl is now focused on NinjaPear, a new data platform.

In January earlier this year (2025), LinkedIn filed a lawsuit against Proxycurl. Today, we are shutting Proxycurl down. The team is now focused on NinjaPear, a Competitive Intelligence Data company. Regardless of the merits of LinkedIn&#39; ]]></description>
        <link>https://nubela.co/blog/goodbye-proxycurl/</link>
        <guid isPermaLink="false">68677169b966d80001974e5b</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 04 Jul 2025 14:15:57 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">The team behind Proxycurl is now focused on </strong></b><a href="https://nubela.co/?ref=proxycurl" rel="noopener"><b><strong style="white-space: pre-wrap;">NinjaPear</strong></b></a>, a new data platform.</div></div><p>In January earlier this year (2025), LinkedIn filed a lawsuit against Proxycurl. Today, we are shutting Proxycurl down. <strong>The team is now focused on </strong><a href="https://nubela.co/?ref=proxycurl" rel="noopener"><strong>NinjaPear</strong></a>, a Competitive Intelligence Data company. Regardless of the merits of LinkedIn's lawsuit, there is no winning in fighting this. This is due to two reasons:</p><ul><li><a href="https://en.wikipedia.org/wiki/American_rule_(attorney's_fees)?ref=nubela.co" rel="noreferrer"><strong>The American Rule</strong></a><strong>,</strong> which means that even if we were to win the lawsuit, we would not be able to claim legal fees.</li><li><strong>LinkedIn,</strong> owned by Microsoft, has more or less an unlimited war chest.</li></ul><p>If I were sappy and any less of an optimist than I am, I'd be dismissive of the fact that LinkedIn had to resort to lawfare to shut us down. Instead, I have now learned a lesson: if I were to build a great and big business, lawfare had better be one of the weapons in my arsenal. And I had better build a business big and fast, so that LinkedIn (or any other huge incumbent competitor) would think twice before suing me, especially if a harmful legal precedent might be made against a defendant with means (like Apollo).</p><p>This is my biggest mistake with Proxycurl—that I chose to grow it organically.</p><p>This is not a sudden closure. Over the past few weeks/months, I have been assisting our existing customers with deboarding Proxycurl as best as I can. If you are an existing customer, please reach out to <a href="mailto:hello@nubela.co">hello@nubela.co</a> and we'll see how I can assist you further.</p><p>I built Proxycurl around two core principles:</p><ul><li><strong>Giving a fuck about the customer.</strong> I'm not sure if it shows, but I made sure that all support emails were replied to properly, within a reasonable time. I also made sure to read all emails, whether sent by our sales reps or our customer support reps. Most, if not all, emails that involved customers had me CC-ed.</li><li><strong>A product for developers, by developers.</strong> This meant backward compatibility, great documentation, clear and transparent pricing, great API error messages, and most importantly, uptime.</li></ul><p>I think this is how we were able to grow Proxycurl to a ~$10M revenue business before we had to shut it down to comply with the legal settlement with LinkedIn.</p><p>All good things come to an end. I have to be honest, this is refreshing. I haven't had a break since I graduated from university some 12 years ago. I continue to retain my work email and this domain.</p><p>Thank you for your support and for giving Proxycurl a chance. I did my best, and this will not be the last you hear from me. I continue to be of service to you. If there is anything I can do to help, feel free to send an email to <a href="mailto:hello@nubela.co">hello@nubela.co</a>.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The Ultimate Guide to the Professional Social Network API: People Profile API (with Python Example) ]]></title>
        <description><![CDATA[ In this first chapter of the &quot;Ultimate Guide to the Professional Social Network API&quot; series, my goal is to get your product integrated with Professional Social Network API without the need to be approved as a Professional Social Network Partner.

This guide is intended for software engineers comfortable ]]></description>
        <link>https://nubela.co/blog/old-the-ultimate-guide-to-the-linkedin-api-people-profile-api-with-python-example/</link>
        <guid isPermaLink="false">65601a72d6eb9000013bfa09</guid>
        <category><![CDATA[ profile api ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Sat, 28 Jun 2025 17:31:14 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>In this first chapter of the "Ultimate Guide to the Professional Social Network API" series, my goal is to get your product integrated with Professional Social Network API without the need to be approved as a Professional Social Network Partner.</p><p>This guide is intended for software engineers comfortable making API calls who would like to short-circuit the business problems that come with the official Professional Social Network API and to get productive immediately.</p><h2 id="what-professional-social-network-apis-exist">What Professional Social Network APIs exist?</h2><p>Professional Social Network is a powerful professional social network. It's a treasure trove of data for professionals and job listings, data that a <a href="https://nubela.co/proxycurl/solutions/hr-tech?ref=nubela.co">recruitment tech startup</a> or a <a href="https://nubela.co/proxycurl/solutions/sales-marketing-automation-api?ref=nubela.co">sales automation product</a> would love to integrate into their offering. Professional Social Network is aware of this value and have <a href="https://developer.professionalsocialnetwork.com/blog/posts/2015/todays-changes?ref=nubela.co">turned off public access to their API since 2015</a>. To gain access to the official Professional Social Network API, you would need to be a Professional Social Network Partner.</p><h3 id="getting-approved-as-a-professional-social-network-partner">Getting approved as a Professional Social Network Partner</h3><p>The Professional Social Network Partner Program is open to four segments of businesses, namely:</p><ol><li>Talent Solutions, for HR tech companies</li><li>Marketing Solutions, for marketing automation companies</li><li>Sales Navigator Application Development, for startups looking to enhance Professional Social Network Sales Navigator</li><li>Professional Social Network Learning Integration, for content companies</li></ol><p>I understand that it is a long and laborious process to get a company approved as a Professional Social Network Partner. Your best bet is to pick the category that best fits your company's offering and apply to be a Professional Social Network Partner.</p><p>Most of the cool Professional Social Network API features also require a paid subscription to Professional Social Network Developer Enterprise Products.</p><h3 id="using-an-unofficial-professional-social-network-api-without-being-a-professional-social-network-partner">Using an unofficial Professional Social Network API without being a Professional Social Network Partner</h3><p>It makes business sense for Professional Social Network to be selective in picking partners because why should they give away their data? The chances are that most companies that apply <strong>will not be approved as a Professional Social Network Partner</strong>.</p><p>Thankfully, you can achieve the same effects of Professional Social Network API with <a href="https://nubela.co/proxycurl/Professional%20Social%20Network?ref=nubela.co">Proxycurl's Professional Social Network API</a>. Even better, Proxycurl's Professional Social Network API has a <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#overview-rate-limit">generous rate limit of 300 requests per minute</a>, and you can get an API key immediately.</p><p>In the rest of this guide, we will go over two code examples: </p><ol><li>One with the official Professional Social Network API.</li><li>One using Proxycurl's Professional Social Network API, designed for developers in your situation.</li></ol><p>While you are waiting to be approved (or not) as Professional Social Network Partner, <a href="https://nubela.co/proxycurl/auth/login?ref=nubela.co">do head over to Proxycurl and get yourself a trial API key</a> so you can get started immediately.</p><h2 id="get-started-with-professional-social-network-consumer-solutions-platform-csp">Get Started With<em> Professional Social Network Consumer Solutions Platform (CSP)</em></h2><p>Most companies will want to start with Professional Social Network's Consumer Solutions Platform (CSP). When you think of Professional Social Network, you are thinking of the rich and bountiful profiles. And the CSP is how you can access these juicy profiles.</p><p>There are only two features of the CSP that allow you to exfiltrate data out of Professional Social Network:</p><ol><li><code>Sign In with Professional Social Network</code> provides the authentication layer to your product by letting users sign in with their professional Professional Social Network profile.</li><li><code>Profile API</code> returns structured data of a profile programmatically.</li></ol><h3 id="sign-in-with-professional-social-network">Sign In with Professional Social Network</h3><p><em>Sign In with Professional Social Network</em> is an OAuth provider for your application. Most people assume that if you use <em>Sign In with Professional Social Network</em>, Professional Social Network will tell you every user's Professional Social Network profile. It turns out that they do not. What can be returned are:</p><ol><li>First/Last name</li><li>Email address</li><li>Profile picture</li></ol><p>Also, there is a rate limit of <code>500</code> requests per day.</p><p>In my opinion, <em>Sign In with Professional Social Network</em> serves very little utility for most applications because the key data you want to extract is the user's Professional Social Network profile and not generic information.</p><p>Proxycurl is currently looking into replicating an alternative to <em>Sign In with Professional Social Network</em>. An alternative that serves similarly as an authentication layer will provide the user's identity in the form of structured data from their Professional Social Network profile.</p><p>In the meantime, do <a href="https://sendy.nubela.co/subscription?f=YI47f4TeTuhdFoSrZ763iI5gnFtkM1892fYkWD4WQBr28jBkqkCoOcaUummVfjrHTdJMswah3Df7630TYW46gSDXzPUw&ref=nubela.co">subscribe to our mailing list</a> so we can send you an update when we have a replacement for <em>Sign In with Professional Social Network</em>.</p><h2 id="people-api">People API</h2><p>The <a href="https://nubela.co/proxycurl/Professional%20Social%20Network?ref=nubela.co">People API</a> is the meat of this chapter.</p><p>To orient you to the People API, we will start with this problem:</p><blockquote>Given a profile ID, how can I get structured data of this profile into my application?</blockquote><h2 id="fetch-profile-data-via-the-official-professional-social-network-profile-api">Fetch profile data via the o<em>fficial Professional Social Network Profile API</em></h2><p>There are two ways to fetch the data of a profile via the official Professional Social Network API:</p><ol><li>The first method is free and available for most developers. The caveat is that you have to <strong>get permission from each profile</strong> you wish to extract into your application.</li><li>The second method is available only for <strong>approved developers on a paid subscription</strong> to Professional Social Network's Consumer Solution Platform. It allows you to fetch profile data from any profile ID.</li></ol><h3 id="seeking-permission-and-getting-structured-data-profile-from-a-user">Seeking permission and getting structured data profile from a user</h3><p>The first method requires you, the developer, to seek permission from the user that owns the profile. To do that, Professional Social Network requires you to fetch an access_token via 3-legged OAuth, a fancy term to describe a two-step process to get an access token.</p><p><strong>Step 0</strong>: Get a CLIENT_ID and CLIENT_SECRET by creating an app at the <em>Professional Social Network Developers</em> page. (You can Google the link for this page)</p><p><strong>Step 1</strong>: To get permission from a user, you will generate an authorization URL to send your user to Professional Social Network so they can permit your application to download their profile.</p><p>In this case, you must provide a REDIRECT_URI, the web page for which Professional Social Network will send the user back after they have finished granting the permission.</p><pre><code class="language-python">def generate_authorization_url():
    """
    Generate an authorization URL for a user to give permission to extract their Professional Social Network Profile.

    The genereated URL will take the user to a Professional Social Network page where the user will be asked to give explicit
    permission to share their profile with you (the application creator).

    Should the user agree, they will be redirected to `Professional Social Network_REDIRECT_URI`.
    In the redirect, two fields will appear in the URL parameter, namely `code` and `state`.

    * `state` is generated below using `secrets.token_hex(8).upper()`. This is as a form of identifier for this user.
    * `code` is the authorization_code, and can be used in `get_access_token()` to exchange for an `access_token`.

    """
    LI_AUTH_URL = 'https://www.professionalsocialnetwork.com/oauth/v2/authorization'
    url = requests.Request('GET', LI_AUTH_URL,
                           params={
                               'response_type': 'code',
                               'client_id': Professional Social Network_CLIENT_ID,
                               'redirect_uri': Professional Social Network_REDIRECT_URI,
                               'state': secrets.token_hex(8).upper(),
                               'scope': '%20'.join(['r_liteprofile', 'r_emailaddress', 'w_member_social']),
                           }).prepare().url
    return url
</code></pre>
<p><strong>Step 2</strong>: You get an authorization code when a user permits you to access their profile. With this code, you will exchange it for an access_token to access the user's profile.</p><pre><code class="language-python">def get_access_token(authorization_code):
    """
    Given a authorization `code`, this function will return you `access_token` which can then be used to access a user's Professional Social Network profile.
    """
    LI_ACCESS_TOKEN_EXCHANGE_URL = 'https://www.professionalsocialnetwork.com/oauth/v2/accessToken'
    access_token = requests.post(LI_ACCESS_TOKEN_EXCHANGE_URL, params={
        'grant_type': 'authorization_code',
        'code': authorization_code,
        'redirect_uri': Professional Social Network_REDIRECT_URI,
        'client_id': Professional Social Network_CLIENT_ID,
        'client_secret': Professional Social Network_CLIENT_SECRET,
    }).json()['access_token']
    return access_token
</code></pre>
<p><strong>Step 3</strong>: Fetch the user's profile.</p><pre><code class="language-python">def get_profile(access_token):
    """
    Fetches the profile of a Professional Social Network user who has given you their permission to view their profile
    """
    LI_PROFILE_API_ENDPOINT = 'https://api.professionalsocialnetwork.com/v2/me'
    r = requests.get(LI_PROFILE_API_ENDPOINT, headers={
                     'Authorization': 'Bearer ' + access_token})
    return r.json()
</code></pre>
<p>The working Python code for this method can be found <a href="https://github.com/nubelaco/Professional%20Social%20Network-api-python3-examples/blob/master/Professional%20Social%20Network_api_method_1.py?ref=nubela.co">on in our Professional Social Network-api-python3-examples GitHub repository</a>.</p><h3 id="querying-a-profile-from-any-profile-id">Querying a profile from any profile ID</h3><p>The second method does not require you to seek permission from the user. But your application must be approved to use the People's Profile API endpoint with a 2-legged OAuth.</p><p><strong>Step 0</strong>: In your pre-approved Professional Social Network App, get the CLIENT_ID and CLIENT_SECRET fields.</p><p><strong>Step 1</strong>: Using your application's CLIENT_ID and CLIENT_SECRET, exchange for access_token.</p><pre><code class="language-python">def get_access_token():
    """
    If you are

    1. an approved Professional Social Network developer
    2. on a paid subscription to their Consumer Product

    You can use this function to fetch an `access_token` to access the API.
    """
    LI_ACCESS_TOKEN_EXCHANGE_URL = 'https://www.professionalsocialnetwork.com/oauth/v2/accessToken'
    access_token = requests.post(LI_ACCESS_TOKEN_EXCHANGE_URL, params={
        'grant_type': 'client_credentials',
        'client_id': Professional Social Network_CLIENT_ID,
        'client_secret': Professional Social Network_CLIENT_SECRET,
    }).json()['access_token']
    return access_token</code></pre><p><strong>Step 2</strong>: Fetch any profile with profile_id</p><pre><code class="language-python">def get_profile(access_token, profile_id):
    """
    Given an `access_token`, fetch structured data of any profile.
    """
    LI_PROFILE_API_ENDPOINT = f'https://api.professionalsocialnetwork.com/v2/people/{profile_id}'
    r = requests.get(LI_PROFILE_API_ENDPOINT, headers={
                     'Authorization': 'Bearer ' + access_token,
                     'X-RestLi-Protocol-Version': '2.0.0'})
    return r.json()</code></pre><p>The working Python code for this method can be found <a href="https://github.com/nubelaco/Professional%20Social%20Network-api-python3-examples/blob/master/Professional%20Social%20Network_api_method_2.py?ref=nubela.co">in our Professional Social Network-api-python3-examples GitHub repository</a>.</p><h2 id="fetch-profile-data-via-proxycurls-professional-social-network-profile-api-endpoint">Fetch profile data via <em>Proxycurl's Professional Social Network Profile API Endpoint</em></h2><p>It is bothersome jumping through the hoops for Professional Social Network's API. For the rest of us, there is Proxycurl, which provides their Professional Social Network API so that you can get everything that Professional Social Network's official Profile API offers, and a <strong>whole lot more</strong>. Check out <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">Proxycurl's Person Profile API documentation</a> to see what data fields are supported.</p><p>There's just one method to get profile data from any profile ID.</p><p><strong>Step 0</strong>: <a href="https://nubela.co/proxycurl/auth/login?ref=nubela.co">Get a Proxycurl API key</a> by signing into Proxycurl with your work email address. </p><p><strong>Step 1</strong>: Query the Profile API endpoint with profile_id</p><pre><code class="language-python">import requests

PROXYCURL_API_KEY = ''  # todo - fill this field up


def get_profile(profile_id):
    api_endpoint = 'https://nubela.co/proxycurl/api/v2/Professional Social Network'
    header_dic = {'Authorization': 'Bearer ' + PROXYCURL_API_KEY}
    params = {
        'url': f'https://www.professionalsocialnetwork.com/in/{profile_id}',
    }
    response = requests.get(api_endpoint,
                            params=params,
                            headers=header_dic)
    return response.json()</code></pre><p>The working Python code for this method can be found <a href="https://github.com/nubelaco/Professional%20Social%20Network-api-python3-examples/blob/master/proxycurl_people_profile_api_endpoint.py?ref=nubela.co">in our Professional Social Network-api-python3-examples Github repository</a>.</p><h2 id="summarizing-the-state-of-the-professional-social-network-profile-api">Summarizing the state of the Professional Social Network Profile API</h2><p>Professional Social Network has made it <strong>extremely difficult</strong> for developers to integrate Professional Social Network Profile export into their system. The Profile API that is free and requires little approval is throttled with rate limits and explicit and cumbersome per-user permission granting. The Profile API with 2-legged OAuth that lets you query any profile ID requires explicit approvals and a hefty amount of money to be paid via a Professional Social Network subscription.</p><p>Proxycurl offers an unbridled equivalent to Professional Social Network's Profile API. The key difference lies in latency. Proxycurl's People Profile API Endpoint performs a live scrape of a profile on each API call, so each call might take a few seconds to complete. To overcome throughput, a developer can launch requests to Proxycurl's API in parallel.</p><p>Did you know that when a user signs in with Professional Social Network, the application developer does not get the user's Professional Social Network profile? In the next update, we will discuss the <em>Sign In with Professional Social Network</em> feature and how you might use Proxycurl's equivalent solution to sign in with Professional Social Network and get the user's Professional Social Network profile back.</p><p>I want to tell you when I post my next follow-up article to Professional Social Network API. <a href="https://sendy.nubela.co/subscription?f=YI47f4TeTuhdFoSrZ763iI5gnFtkM1892fYkWD4WQBr28jBkqkCoOcaUummVfjrHTdJMswah3Df7630TYW46gSDXzPUw&ref=nubela.co">Subscribe to our mailing list</a> so I can ping you when it is ready!</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Top 5 Professional Social Network Scrapers in 2023 - Detailed Reviews with Ratings ]]></title>
        <description><![CDATA[ 💡Old post - republished with new content

You are probably reading this article because you are seeking a solution to fetch fresh Professional Social Network profile data at scale. In this article, I&#39;ll introduce and provide a cursory review of the top 5 Professional Social Network scraping API ]]></description>
        <link>https://nubela.co/blog/top-5-linkedin-scrapers-in-2023-detailed-reviews-with-ratings/</link>
        <guid isPermaLink="false">6549e010eb400500015ac4d0</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Sat, 28 Jun 2025 17:31:14 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">Old post - republished with new content</div></div><p>You are probably reading this article because you are seeking a solution to fetch fresh Professional Social Network profile data at scale. In this article, I'll introduce and provide a cursory review of the top 5 Professional Social Network scraping API services to help your comparison. For each Professional Social Network Scraper Tool, I will also link you to a detailed review of the service.</p>
<h2 id="challenges-of-scraping-professional-social-network-at-scale">Challenges of scraping Professional Social Network at scale</h2>
<p>Scraping Professional Social Network at scale is hard. And for most people, you do not want to do it yourself.</p>
<p>For one, you might want to outsource the risks of scraping Professional Social Network profiles. What risks? Well, we do know that with the [hiQ Labs VS Professional Social Network case](<a href="https://nubela.co/blog/is-Professional">https://nubela.co/blog/is-Professional</a> Social Network-scraping-legal/), scraping publicly accessible Professional Social Network profiles is considered legal. But from the [Mantheos Pte Ltd VS Professional Social Network Corp](<a href="https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional">https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional</a> Social Network-scraping-service-is-sued-by-Professional Social Network/) case, we learned that scraping <strong>private</strong> Professional Social Network profiles would put you in an unsafe situation.</p>
<p>Another reason you might be seeking a Professional Social Network scraping service is that scraping Professional Social Network is <strong>hard</strong>, and you want the data <strong>soon</strong>. In fact, for most people, you do not want to be building a Professional Social Network scraper unless your time is cheap. There are two primary ways you could go the DIY route. First, there is an illegal way of scraping Professional Social Network profiles with a Professional Social Network account. Ignoring that it is not legal, you must bypass Recaptchas, implement a daily rate limit, parse raw API data, etc. Then there are publicly accessible Professional Social Network profiles which are shown to search engines for indexing. First, you must figure out a method to fetch a publicly accessible Professional Social Network profile consistently without being stopped by a Professional Social Network authwall. Then you perform tests to verify that the method scales beyond ten profiles within a reasonable time. After that, you have to parse the data yourself.</p>
<p>So it's not easy. And here's the best part: Professional Social Network is a moving target. That means whatever scraper you have built today might not work tomorrow. Do you want to maintain a Professional Social Network scraper in perpetuity? Probably not.</p>
<p>Here are the top 5 Professional Social Network Scraper API services that I will be reviewing today. Hopefully, one of them might be useful to you:</p>
<ul>
<li>BrightData</li>
<li>Proxycurl</li>
<li>CoreSignal</li>
<li>People Data Labs</li>
<li>PhantomBuster</li>
</ul>
<h2 id="reviews-of-the-top-5-professional-social-network-scraper-api-tools">Reviews Of The Top 5 Professional Social Network Scraper API Tools</h2>
<p>I will be judging these Professional Social Network Scrapers by the following attributes:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/Reviewing_the_Top_5_Professional Social Network_Scraping_API_Services_copy.png" class="kg-image" alt="7 key attributes of a great Professional Social Network Scraper Tool" loading="lazy" width="2048" height="1040"><figcaption><span style="white-space: pre-wrap;">7 key attributes of a great Professional Social Network Scraper Tool</span></figcaption></figure><ul>
<li><strong>Freshness of data</strong> is self-explanatory.</li>
<li><strong>Richness of data</strong> refers to the vastness of data points that will be returned to you.</li>
<li><strong>Scalability</strong> refers to how many profiles you can scrape, and how fast your queries run.</li>
<li><strong>Pricing</strong> refers to the cost per profile.</li>
<li><strong>Developer friendliness</strong> refers to the ease with which a software engineer can use the service.</li>
<li><strong>Stability</strong> refers to how stable the service has been over the years.</li>
<li><strong>Compliance</strong> refers to the legal work done to ensure that the data you fetch from the service is legally compliant.</li>
</ul>
<p>These are the findings:</p>
<table>
<thead>
<tr>
<th></th>
<th>BrightData</th>
<th>Proxycurl</th>
<th>CoreSignal</th>
<th>People Data Labs</th>
<th>PhantomBuster</th>
</tr>
</thead>
<tbody>
<tr>
<td>Freshness of data</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Richness of data</td>
<td>⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Scalability</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐⭐⭐</td>
</tr>
<tr>
<td>Developer Friendliness</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐</td>
<td>⭐⭐⭐</td>
<td>⭐⭐</td>
</tr>
<tr>
<td>Stability</td>
<td>⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐⭐</td>
<td>⭐⭐⭐</td>
<td>⭐</td>
</tr>
<tr>
<td>Compliance</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
</tr>
<tr>
<td>Average rating</td>
<td><code>3.42/5</code></td>
<td><code>4.14/5</code></td>
<td><code>2.71/5</code></td>
<td><code>3/5</code></td>
<td><code>2.42/5</code></td>
</tr>
</tbody>
</table>
<p>Now, let's go into the individual reviews.</p>
<h3 id="1-brightdata-3425-%E2%AD%90%E2%AD%90%E2%AD%90">1. BrightData (3.42/5) ⭐⭐⭐</h3>
<p>Bright Data's core business is in renting residential IP addresses. Bright Data figured they could charge more if they built a web crawler service on top of their network of residential IP addresses. And that is precisely what they did with their Data Collector product which features a Professional Social Network Scraper. Bright Data's Professional Social Network Scraper is priced at $0.05 / Professional Social Network profile. Bright Data requires a subscription plan.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Bright Data has a community-maintained scraper. That means you do not have to worry about parsing HTML data. And you can get structured data from Professional Social Network profiles directly.</li>
<li>The prices are reasonable.</li>
<li>The company has been around for years and is legally compliant.</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Bright Data has a community-maintained scraper. Because the parsing code relies on the goodwill of community contributions, if Professional Social Network changes anything on their site, customers will need to await the community to keep the scraper up to date.</li>
<li>Has an 80% success rate per API call.</li>
</ul>
<p>For a deeper dive into BrightData, see [our in-depth review on Bright Data's Professional Social Network Profile Scraper](<a href="https://nubela.co/blog/proxycurl-api-vs-brightdatas-Professional">https://nubela.co/blog/proxycurl-api-vs-brightdatas-Professional</a> Social Network-profile-scraper/).</p>
<h3 id="2-proxycurl-4145-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90">2. Proxycurl (4.14/5) ⭐⭐⭐⭐</h3>
<p>Proxycurl provides an enrichment API for people and companies. Their API is well-maintained and has comprehensive API documentation.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Manages multiple methods to scrape Professional Social Network profiles.</li>
<li>Has been around since 2014.</li>
<li>Enriches Professional Social Network profiles with data from external sources.</li>
<li>Fair cost of $0.009 / profile (depending on which subscription plan you are on).</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Rate limit of 300 requests/minute.</li>
<li><a href="https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/">Caches profiles for up to 29 days.</a></li>
</ul>
<p>Proxycurl focuses on powering products centred around fresh data on people and businesses. Given that it works with large Enterprise customers, It understands the need to stay compliant and stable. Most of the work under the hood is in keeping the service stable as it seeks to be a plumbing infrastructure for companies to fetch fresh data without building a dedicated scraping team.</p>
<p>Proxycurl's API is fast and reliable, and it's well-documented. You will come to Proxycurl for its Professional Social Network scraping service but end up staying for every other API endpoint, such as its <a href="https://nubela.co/proxycurl/email-lookup?ref=nubela.co">Work Email Lookup Endpoint</a> which will fetch verified work email profiles from any Professional Social Network profiles.</p>
<h3 id="3-coresignal-35-%E2%AD%90%E2%AD%90%E2%AD%90">3. CoreSignal (3/5) ⭐⭐⭐</h3>
<p>CoreSignal's core product is its bulk datasets.</p>
<p>CoreSignal's real-time API does not scrape Professional Social Network profiles in real-time. What it offers is an API service that reads their database and returns cached profiles.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Has a dataset that is bigger and richer (For example, CoreSignal has 91M Company Profiles VS Professional Social Network's 17M Company Profiles)</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Does not scrape Professional Social Network profiles live. Real-time API reads their database.</li>
<li>Stale data (3-4 months old)</li>
</ul>
<p>For a deeper dive, see [our in-depth review on CoreSignal Professional Social Network data scraper](<a href="https://nubela.co/blog/proxycurl-api-vs-brightdatas-Professional">https://nubela.co/blog/proxycurl-api-vs-brightdatas-Professional</a> Social Network-profile-scraper/).</p>
<h3 id="4-people-data-labs-255-%E2%AD%90%E2%AD%90">4. People Data Labs (2.5/5) ⭐⭐</h3>
<p>Let's get it out of the way. People Data Labs (PDL) does not scrape Professional Social Network profiles. They also do not offer a service that scrapes Professional Social Network profiles. People Data Labs is not a Professional Social Network scraping service. Their core business lies in buying and combining a myriad of datasets from data vendors, packaging them up in an API and upselling the data.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Enrich profiles with extra data points such as personal emails and phone numbers</li>
<li>Has search functionality via API</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Serves stale profile data</li>
</ul>
<p>For a deeper dive, see <a href="https://nubela.co/blog/proxycurl-vs-peopledatalabs-pdl/">our in-depth review on People Data Labs</a>.</p>
<h3 id="5-phantombuster-2425-%E2%AD%90%E2%AD%90">5. PhantomBuster (2.42/5) ⭐⭐</h3>
<p>PhantomBuster is a scraper tool that sits on top of your Professional Social Network account to scrape Professional Social Network profiles. In other words, to use PhantomBuster, you will need to provide Professional Social Network credentials (in the form of a cookie), so they can automate scraping on your account.</p>
<p>PhantomBuster works for small-scale Professional Social Network scraping for personal use cases. It works if you are an account executive, and you are looking to automate your Professional Social Network workflow by scraping your connections for a cold email campaign. Still, your account might get blocked because there is a maximum limit to the number of profiles that can be viewed daily.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Scrapes private Professional Social Network profile (if you don't care about the legal liabilities)</li>
<li>Has UI to read-from/write-to spreadsheets</li>
<li>100% API success rate</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Bring your own Professional Social Network account</li>
<li>At serious legal risk. See Mantheos's lawsuit</li>
<li>7 hours for 1000 profiles</li>
</ul>
<p>For a deeper dive, see <a href="https://nubela.co/blog/proxycurl-api-vs-coresignal/">our in-depth review on PhantomBuster Professional Social Network profile scraper</a>.</p>
<h2 id="best-professional-social-network-scraping-tools-your-pick">Best Professional Social Network scraping tools? Your pick</h2>
<p>You can probably figure out my opinion based on these ratings. What's your own verdict after reading through the reviews? These Professional Social Network data scrapers might seem like the same on the surface, but digging deeper, you'll see the vast differences in how they work. This is where you need to decide what works best for your unique company's use cases, and take a pick from this list.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How can I retrieve a list of all employees within a company through the Professional Social Network API? ]]></title>
        <description><![CDATA[ In this post, we&#39;re going to answer a StackOverflow question. You can still [view the original question on StackOverflow](https://stackoverflow.com/questions/55246288/how-can-i-retrieve-a-list-of-all-employees-within-a-company-through-the-Professional Social Network), but we&#39;ll provide the text of the question below also. Or you can skip below to our answer.





Years ]]></description>
        <link>https://nubela.co/blog/old-how-can-i-retrieve-a-list-of-all-employees-within-a-company-through-the-linkedin-api/</link>
        <guid isPermaLink="false">65bc6ca386ccd600018f3c47</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Sat, 28 Jun 2025 17:31:13 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>In this post, we're going to answer a StackOverflow question. You can still [view the original question on StackOverflow](<a href="https://stackoverflow.com/questions/55246288/how-can-i-retrieve-a-list-of-all-employees-within-a-company-through-the-Professional?ref=nubela.co">https://stackoverflow.com/questions/55246288/how-can-i-retrieve-a-list-of-all-employees-within-a-company-through-the-Professional</a> Social Network), but we'll provide the text of the question below also. Or you can skip below to <a href="#ouranswer">our answer</a>.</p>
<blockquote>
<p><em>Years ago, someone asked...if it were possible to retrieve a list of all employees who work at a company. I can do this through the Professional Social Network UI, but I cannot seem to find any mechanism for this using the v2 API. The SO response mentions this used to be possible on the v1 API, but you had to request access through Professional Social Network's "Vetted API Access Program." Unfortunately, the link on this response is now obsolete and does not send users to any such program.</em><br>
<em>How could I apply for this program nowadays? This is a specific situation to me and my company, so I would very much like to discuss this with someone at Professional Social Network if some form of this Vetted API Access Program still exists. I do not wish to disclose the details of this request to the open internet.</em></p>
</blockquote>
<h2 id="our-answer">Our answer</h2>
<p>You can get a list of employees of a company in two ways:</p>
<ul>
<li>If you scrape Professional Social Network profiles exhaustively</li>
<li>If you already have an exhaustive dataset of Professional Social Network profiles.</li>
</ul>
<p>Each Professional Social Network profile contains a list of "experiences," each of which links to a company profile URL. So once you have a data set, the process to create your list consists of two steps:</p>
<ol>
<li>Parse the profiles into JSON so you can easily filter them</li>
<li>Filter the parsed profiles based on who currently works at a particular company. Now you have your list of current employees!
<ul>
<li>You can instead filter based on "past" experiences (i.e. those with an end date) to find past, or even all, employees)</li>
</ul>
</li>
</ol>
<p>And that is exactly what we did. We scraped all public Professional Social Network profiles based in several countries, including the United States, Singapore, and Canada; and we made an alternative API known as the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint">Proxycurl Employee Listing API</a>, which provides employee listing functionality.</p>
<h3 id="code-sample">Code sample</h3>
<p>There are three prerequisites to run this code (assuming you have Python installed and set up already):</p>
<ol>
<li>Create a <a href="https://nubela.co/proxycurl/?ref=nubela.co">Proxycurl account</a>.</li>
<li>Go to your <a href="https://nubela.co/proxycurl/dashboard?ref=nubela.co">Proxycurl dashboard</a> and find your API key.</li>
<li>Create an environment variable called <code>PROXYCURL_API_KEY</code> set to your API key.</li>
</ol>
<p>That's it! Here's the code in which we'll list 3 current employees of Apple. You can run this with your trial credits:</p>
<pre><code class="language-python">import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}

api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/company/employees/'
params = {
    'url': 'https://www.professionalsocialnetwork.com/company/apple/',
    'page_size': '3',  # set your page_size as desired
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
</code></pre>
<p>Our API will never be as exhaustive as Professional Social Network's dataset because not all profiles are made public, but most are - enough to meet your needs, and certainly better than the "nothing at all" that Professional Social Network themselves offer. <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint">Check it out</a> and see for yourself!</p>
<h3 id="bonus-code-sample">Bonus code sample</h3>
<p>Excited about what Proxycurl's <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint">Employee Listing Endpoint</a> can do? <a href="https://nubela.co/proxycurl/dashboard/billing/buy-credits?ref=nubela.co">Make a top-up with some credits now</a>, and we can retrieve a list of employees <strong>in order of when they joined</strong>.</p>
<p>For up-to-date pricing of the <code>sort_by</code> parameter, please see <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint">our documentation</a>, as it is significantly more expensive than the unsorted version. Set the limit accordingly, and optionally include the parameter <code>role_search</code> as well.</p>
<pre><code class="language-python">import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}

api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/company/employees/'
params = {
    'url': 'https://www.professionalsocialnetwork.com/company/apple/',
    'sort_by': 'recently-joined',
    'page_size': '3',  # set your page_size as desired
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
</code></pre>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The 10 Best LinkedIn Automation Tools for Lead Generation in 2026 ]]></title>
        <description><![CDATA[ From saving valuable time to enhancing outreach and engagement, Professional Social Network automation tools are not just about automating processes; they&#39;re about transforming your Professional Social Network strategy into a more productive and effective mechanism for generating quality leads. ]]></description>
        <link>https://nubela.co/blog/the-10-best-linkedin-automation-tools-for-lead-generation/</link>
        <guid isPermaLink="false">659da65de44b0e0001f4ce0c</guid>
        <category><![CDATA[ lead generation ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Sat, 28 Jun 2025 17:31:13 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_437.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you are searching for the best LinkedIn automation tools for lead generation in 2026, the short answer is this: <strong>Dux-Soup, Waalaxy, PhantomBuster, Meet Alfred, and Reply.io</strong> are the serious automation options, but <strong>the legal and account-risk tradeoff is worse than most comparison posts admit</strong>. I learned this the expensive way. I spent years in this market, built Proxycurl, got sued by LinkedIn, and eventually moved on because there are easier ways to get pipeline without building your GTM engine on top of a platform that clearly does not want to be automated.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/b2bmarketing</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/erickrealz</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">LinkedIn has gotten way more aggressive about detecting automation in the past five years so whatever you used before might get you banned faster now. The landscape shifted toward cloud-based tools because they're harder for LinkedIn to detect than browser extensions.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/b2bmarketing/comments/1piuuzb/is_there_a_better_alternative_to_linkedin_helper2/nter98y/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>The original version of this article had the right topic and the right skeleton. It was just unfinished, over-censored, and still anchored to an older market. So I am keeping the structure, updating it in place, and telling you what actually matters now.</p>
<h1 id="the-role-of-linkedin-automation-tools">The role of LinkedIn automation tools</h1>
<p>LinkedIn automation tools exist for one reason: <strong>manual outreach does not scale</strong>.</p>
<p>If you are doing outbound from a founder seat, a small SDR team, or an agency desk, the time sink is always the same:
- searching for the right people,
- sending connection requests,
- following up,
- moving replies into a CRM,
- and trying not to lose your account in the process.</p>
<p>That is what these tools are trying to fix.</p>
<p>Some tools automate actions inside LinkedIn itself, like profile visits, connection requests, messages, and follow-ups. Others sit one layer away and help you <strong>extract leads, enrich them, verify emails, or run multichannel sequences</strong> once the prospect list is already built.</p>
<p>That distinction matters more in 2026 than it did a few years ago.</p>
<h1 id="how-do-linkedin-automation-tools-work">How do LinkedIn automation tools work?</h1>
<p>Most LinkedIn automation tools do one of three things:</p>
<ol>
<li><strong>Browser-based automation</strong></li>
</ol>
<p>Chrome extensions and local agents mimic human actions inside LinkedIn or Sales Navigator. That usually means visiting profiles, clicking Connect, sending a message, or exporting search results.</p>
<ol>
<li><strong>Cloud-based automation</strong></li>
</ol>
<p>These tools run campaigns from remote infrastructure. Vendors usually pitch them as safer because your browser does not need to stay open 24/7.</p>
<ol>
<li><strong>Data-first workflow tools</strong></li>
</ol>
<p>These do not necessarily automate LinkedIn actions. Instead, they help you build lists, find verified emails, enrich accounts, sync data into CRMs, and launch outbound from email or sales engagement tools.</p>
<p>If your entire motion depends on automating actions inside LinkedIn, you are taking on a very different risk profile from someone using LinkedIn only as a discovery layer.</p>
<h1 id="in-the-case-of-linkedin-lead-generation-tools-though">In the case of LinkedIn lead generation tools, though...</h1>
<p>LinkedIn lead generation tools are not all doing the same job.</p>
<p>Some are built for <strong>network growth</strong>. Some are built for <strong>Sales Navigator extraction</strong>. Some are built for <strong>email enrichment after you identify a lead</strong>. And some are really <strong>outbound sequencers</strong> with LinkedIn as one channel among several.</p>
<p>That is why tool comparisons in this category are usually messy. People compare a scraper, a data vendor, and a sequencer like they are interchangeable. They are not.</p>
<p>So below, I am keeping the original top-10 shape, but I am telling you <strong>what each tool is actually good for</strong>, how I would use it for lead generation, and where the sharp edges are.</p>
<h1 id="how-linkedin-lead-generation-tools-can-help-your-outreach">How LinkedIn lead generation tools can help your outreach</h1>
<h2 id="1-targeted-outreach">1) Targeted outreach</h2>
<p>The obvious use case is building a list of people by title, company, geography, or buyer fit, then reaching out with something more specific than a mail-merge hallucination.</p>
<p>A good tool helps you narrow to:
- job title,
- company size,
- industry,
- geography,
- and often buying context like recent hiring, funding, or tech stack.</p>
<h2 id="2-automated-follow-ups">2) Automated follow-ups</h2>
<p>Most replies do not come from the first touch.</p>
<p>The useful tools here automate the boring part: spacing messages, stopping campaigns when someone replies, and keeping your daily volume under a threshold that does not look absurd.</p>
<h2 id="3-lead-scoring-and-prioritization">3) Lead scoring and prioritization</h2>
<p>This is where cheap automation starts to break.</p>
<p>Anyone can blast 300 invites a month. The harder problem is deciding <strong>who deserves outreach first</strong>. Data vendors and enrichment tools help here by adding verified emails, company context, technographics, or buying signals so you are not sequencing everyone with a pulse.</p>
<h2 id="4-integration-with-crm">4) Integration with CRM</h2>
<p>If replies live in LinkedIn, leads live in a CSV, and account notes live in someone’s head, you do not have a GTM system. You have a hobby.</p>
<p>The better tools sync to Salesforce, HubSpot, Outreach, Salesloft, Zapier, Make, or webhooks so your list-building does not die in a spreadsheet tab.</p>
<h1 id="the-10-best-linkedin-lead-generation-tools">The 10 best LinkedIn lead generation tools</h1>
<p>Before the tool-by-tool breakdown, here is the quick comparison.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th style="text-align: right;">Data quality</th>
<th style="text-align: right;">Pricing</th>
<th style="text-align: right;">Ease of use</th>
<th style="text-align: right;">API</th>
<th style="text-align: right;">Support</th>
<th style="text-align: right;">Avg. score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dux-Soup</td>
<td>Classic LinkedIn automation</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.4/5</td>
</tr>
<tr>
<td>UpLead</td>
<td>Contact data and enrichment</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">4.0/5</td>
</tr>
<tr>
<td>Reply.io</td>
<td>Multichannel sequencing</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.8/5</td>
</tr>
<tr>
<td>Evaboot</td>
<td>Sales Navigator exports</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">4.0/5</td>
</tr>
<tr>
<td>Lusha</td>
<td>Fast contact lookup</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">4.0/5</td>
</tr>
<tr>
<td>PhantomBuster</td>
<td>Flexible scraping workflows</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">3.6/5</td>
</tr>
<tr>
<td>Waalaxy</td>
<td>Beginner-friendly LinkedIn outreach</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">4.0/5</td>
</tr>
<tr>
<td>LinkedIn Scraper</td>
<td>Raw extraction use cases</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">2.4/5</td>
</tr>
<tr>
<td>Meet Alfred</td>
<td>LinkedIn + email + X outreach</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.6/5</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Non-LinkedIn alternative</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">4.6/5</td>
</tr>
</tbody>
</table>
<h2 id="1-proxycurl">1) Proxycurl</h2>
<p><strong>Callout:</strong> Proxycurl has been sunset. I am retaining it here because it was in the original article and a lot of older buyers still search for it by name. The founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which takes a different approach: competitive intelligence and B2B data from public web sources, not LinkedIn automation.</p>
<p>Proxycurl was never a pure LinkedIn automation tool in the Dux-Soup sense. It was an API-first data product for profile enrichment, company data, employee listing, contact lookup, and search workflows built around public professional data.</p>
<p>How you would have used Proxycurl for lead generation:
- enrich a prospect profile from a LinkedIn URL,
- find employee lists at target accounts,
- search for likely buyers by role,
- attach contact data,
- then push that into an outbound system.</p>
<p>That architecture is still the right architecture, by the way. <strong>Data first, outreach second</strong>. The product name just changed, and frankly the market moved.</p>
<p>If you came here specifically looking for Proxycurl, the modern answer is not "find the closest clone." The better answer is to skip LinkedIn-derived dependency where you can and look at NinjaPear instead, especially if you care about legal durability.</p>
<h2 id="2-uplead">2) UpLead</h2>
<p>UpLead is not a LinkedIn automation tool either, but it belongs in this list because a lot of teams do not actually need automation inside LinkedIn. They need <strong>accurate contact data fast</strong>.</p>
<p>UpLead says it has <strong>180M+ leads</strong>, <strong>95% data accuracy</strong>, <strong>50+ search filters</strong>, real-time email verification, and API access. Public pricing is straightforward:
- <strong>Free trial</strong>: 5 credits for 7 days
- <strong>Essentials</strong>: $99/month for 170 credits
- <strong>Plus</strong>: $199/month for 400 credits
- <strong>Professional</strong>: custom</p>
<p>How I would use UpLead for lead generation:
1. define ICP filters by industry, size, role, location, or tech stack,
2. export a clean contact set,
3. verify emails on export,
4. sync into Reply.io, Outreach, HubSpot, or whatever sequencer you already use.</p>
<p>The main upside is obvious: you do not need to automate LinkedIn actions to get a list moving.</p>
<p>The downside is also obvious: if your strategy depends on warm social touchpoints inside LinkedIn, UpLead is not doing that for you. It is a database plus enrichment product, not a connection-request engine.</p>
<h2 id="3-replyio">3) Reply.io</h2>
<p>Reply.io sits in the sequencer bucket.</p>
<p>It supports LinkedIn outreach, but the bigger value is that it combines that with email, calls, SMS, and AI-assisted outreach logic. On its site, Reply.io explicitly lists LinkedIn steps such as:
- sending connection requests,
- sending messages and InMails,
- attaching files and voice messages,
- liking posts,
- following profiles,
- and endorsing skills.</p>
<p>How I would use Reply.io for lead generation:
- build the list elsewhere,
- push contacts into Reply,
- run a sequence that mixes email with lighter LinkedIn touches,
- and let reps take over when someone replies.</p>
<p>This is the right product shape if your team already knows that <strong>single-channel outreach is usually weaker than multichannel outreach</strong>.</p>
<p>The tradeoff is complexity. The more channels you add, the more you need list hygiene, CRM discipline, sender health, and actual process. Reply.io can absolutely drive pipeline. It can also expose a sloppy team very quickly.</p>
<h2 id="4-dux-soup">4) Dux-Soup</h2>
<p>Dux-Soup is one of the older names in this category and still one of the more recognizable ones.</p>
<p>It automates LinkedIn profile visits, follows, endorsements, connection requests, InMails, and messages. It also pushes leads into CRMs and positions itself as an always-on LinkedIn automation tool running on your native LinkedIn or Sales Navigator account.</p>
<p>How I would use Dux-Soup for lead generation:
- start with a tightly filtered Sales Navigator search,
- warm the audience with profile visits,
- send connection requests with light personalization,
- trigger a short message sequence after acceptance,
- and stop the automation the moment someone replies.</p>
<p>That last part matters. A lot.</p>
<p>Dux-Soup makes the most sense for founders, solo operators, and small teams who want <strong>simple LinkedIn workflow automation without building a whole outbound machine</strong>.</p>
<p>Its biggest limitation is also the category’s biggest limitation: the closer you get to automating actual on-platform behavior, the more you are negotiating with LinkedIn’s enforcement systems.</p>
<p>Users keep saying the same thing in public forums:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/GrowthHacking</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/admiralwan</span>
<span style="color:#878a8c;">· ▲ 23</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I’m trying to build a consistent outbound process on LinkedIn without spending my entire day messaging people manually. Ideally looking for something that can handle multiple steps (visit, connect, follow-up). Would love to hear what tools you’ve used that actually worked and didn’t get your account flagged.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/GrowthHacking/comments/1kr06zz/whats_the_best_linkedin_automation_tool_for/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the real market. Not "how do I automate?" but "how do I automate without getting flagged?"</p>
<h2 id="5-evaboot">5) Evaboot</h2>
<p>Evaboot is one of the cleaner products in this space because it is very specific about its job.</p>
<p>It is a <strong>Sales Navigator scraper and cleaner</strong>. It exports lead lists, cleans first names and company names, validates whether leads actually match your filters, finds work emails, and verifies them.</p>
<p>Pricing starts at <strong>$9/month</strong>, which makes it one of the cheaper tools here.</p>
<p>How I would use Evaboot for lead generation:
1. run a precise Sales Navigator search,
2. export the list through Evaboot,
3. remove false positives,
4. verify email coverage,
5. ship the cleaned CSV into your sequencer.</p>
<p>That last step is why Evaboot works. It is not pretending to be your CRM, your dialer, your AI SDR, and your prospecting OS all at once.</p>
<p>It does one useful thing: <strong>turn messy Sales Navigator output into outreach-ready data</strong>.</p>
<p>It also exposes a limitation that many buyers ignore. If your outreach engine depends on exporting data from Sales Navigator, you are still operating in the LinkedIn gray zone, just one level removed from direct messaging automation.</p>
<h2 id="6-lusha">6) Lusha</h2>
<p>Lusha plays the fast-contact-data game.</p>
<p>It offers verified B2B contact and company data, browser extension workflows, API access, CRM integrations, and buying-signal features. Public pricing starts at:
- <strong>Free</strong>: $0/month
- <strong>Starter</strong>: $37.45/month billed yearly
- <strong>Pro</strong>: $52.45/month billed yearly
- <strong>Premium</strong>: custom</p>
<p>How I would use Lusha for lead generation:
- identify a prospect on LinkedIn or the open web,
- use the Chrome extension to pull contact details,
- push the record into CRM,
- and sequence from email or phone rather than over-automating LinkedIn itself.</p>
<p>Lusha is good when reps are already prospecting manually and just need to <strong>compress the gap between “I found the right person” and “I can actually contact them.”</strong></p>
<p>I would not use it as the center of a fully scaled outbound engine. I would use it as a speed layer for reps.</p>
<h2 id="7-phantombuster">7) PhantomBuster</h2>
<p>PhantomBuster is the Swiss Army knife of this category.</p>
<p>That is both the appeal and the problem.</p>
<p>It is flexible. Very flexible. You can chain automations, scrape data, trigger workflows, and do far more than just LinkedIn. Public pricing starts at <strong>$59/month</strong>, with the commonly cited monthly entry point at <strong>$69/month</strong> and annual discounts bringing it lower.</p>
<p>How I would use PhantomBuster for lead generation:
- scrape lead lists from a defined workflow,
- enrich or export them,
- pipe them into another system,
- and use it more as infrastructure than as a day-to-day rep console.</p>
<p>If you are technical, PhantomBuster can be very powerful.</p>
<p>If you are not technical, it can become a pile of half-working automations held together by optimism.</p>
<p>And users do notice the cost layering:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Botdog</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/soveet</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I was about to subscribe to Phantom Buster today, but thought I should at least search first for some cheaper alternatives because that $69 a month plus the cost of sales navigator was adding up to a lot! And i had the feeling that $69 is being charged for the huge array of 'Phantoms' that they've built up which I am not gonna use but pay for.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Botdog/comments/1gisqmw/best_alternatives_to_phantombuster_waalaxy/mr7k2xo/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is a fair criticism.</p>
<p>PhantomBuster is best when you need breadth and are willing to manage the complexity.</p>
<h2 id="8-waalaxy">8) Waalaxy</h2>
<p>Waalaxy has done a good job owning the beginner-friendly part of this market.</p>
<p>Its pricing is unusually accessible:
- <strong>Pro</strong>: €19/user/month, 300 invites/month
- <strong>Advanced</strong>: €49/user/month, 800 invites/month
- <strong>Business</strong>: €69/user/month, 800 invites/month plus multichannel email features
- <strong>Enterprise</strong>: custom</p>
<p>Waalaxy includes unlimited campaigns, automated follow-ups, CRM sync, CSV import/export, and API access on higher plans. The Business plan adds cold email sequences and 500 email finder credits.</p>
<p>How I would use Waalaxy for lead generation:
- for a founder-led sales motion,
- with small daily volumes,
- using simple connect-and-follow-up campaigns,
- and graduating to multichannel only after the copy is already proven.</p>
<p>I like that Waalaxy is explicit about invite limits by plan. That is more honest than pretending you can spam infinitely if you just look human enough.</p>
<p>The bigger issue is still platform dependency. Waalaxy can make the workflow easier. It does not change who owns the underlying network.</p>
<h2 id="9-linkedin-scraper">9) LinkedIn Scraper</h2>
<p>I am keeping this slot because the original article had it, but I need to be more precise.</p>
<p>"LinkedIn Scraper" is not one dominant product name in the same way Dux-Soup or Waalaxy is. In practice, buyers usually mean one of these:
- a Chrome extension that exports LinkedIn or Sales Navigator results,
- a GitHub script,
- a low-cost scraping utility,
- or a generic extractor sold under a very literal name.</p>
<p>How you would use a LinkedIn scraper for lead generation:
- pull profile URLs or search results,
- normalize the data,
- enrich emails elsewhere,
- then run outbound from email or CRM.</p>
<p>The reason I rank this lower is simple: the cheap generic scraper route often creates more downstream work than it saves.</p>
<p>You get messy names, duplicate records, missing company domains, busted exports, and no reliable support when LinkedIn changes page structure.</p>
<p>If you are technical and cost-sensitive, you may still accept that tradeoff.</p>
<p>If you are running a real revenue team, I would rather pay for a tool that has already cleaned the workflow.</p>
<h2 id="10-meet-alfred">10) Meet Alfred</h2>
<p>Meet Alfred was one of the first tools to push hard on <strong>multichannel outreach</strong>, and that is still its main value.</p>
<p>It combines LinkedIn, email, and X outreach with inbox management, campaign tracking, CRM sync, and AI-assisted prospecting features. Public pricing starts at <strong>$59/user/month billed monthly</strong>.</p>
<p>How I would use Meet Alfred for lead generation:
- build segmented prospect lists,
- run lighter LinkedIn touches first,
- then continue through email and X if needed,
- and manage replies from a unified inbox.</p>
<p>Meet Alfred makes the most sense for users who want one place to run outbound across multiple channels without stitching together three or four separate tools.</p>
<p>Its own positioning is pretty blunt, and correctly so. Manual prospecting burns time. Multichannel gets more reply opportunities. That part is true.</p>
<p>The usual warning still applies: more automation channels do not fix weak targeting or bad copy.</p>
<h1 id="recapping-all-10-linkedin-automation-tools">Recapping all 10 LinkedIn automation tools</h1>
<p>Here is how I would categorize the list in plain English.</p>
<ul>
<li><strong>Best pure LinkedIn automation:</strong> Dux-Soup</li>
<li><strong>Best beginner-friendly LinkedIn automation:</strong> Waalaxy</li>
<li><strong>Best flexible automation infrastructure:</strong> PhantomBuster</li>
<li><strong>Best multichannel sequencer:</strong> Reply.io</li>
<li><strong>Best multichannel all-in-one for smaller teams:</strong> Meet Alfred</li>
<li><strong>Best Sales Navigator export workflow:</strong> Evaboot</li>
<li><strong>Best contact database alternative:</strong> UpLead</li>
<li><strong>Best rep-side contact lookup:</strong> Lusha</li>
<li><strong>Best generic low-cost extraction path:</strong> LinkedIn Scraper, if you know what you are doing</li>
<li><strong>Best non-LinkedIn alternative:</strong> <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></li>
</ul>
<h1 id="the-best-lead-generation-tool-for-scalability">The best lead generation tool for scalability</h1>
<p>If you mean <strong>scaling automated actions inside LinkedIn</strong>, I would look first at <strong>Waalaxy</strong> or <strong>Dux-Soup</strong>, depending on your appetite for simplicity versus control.</p>
<p>If you mean <strong>scaling pipeline generation</strong>, my answer changes.</p>
<p>At scale, the winners are usually <strong>data-first tools plus multichannel sequencing</strong>, not pure LinkedIn bots.</p>
<p>That means combinations like:
- UpLead + Reply.io
- Evaboot + Reply.io
- Lusha + your CRM/sequencer
- or, increasingly, NinjaPear + your CRM/sequencer</p>
<p>This is the point most listicles miss. You do not scale by automating more clicks. You scale by improving:
- list quality,
- timing,
- relevance,
- and contact coverage.</p>
<p>The click automation part is the least defensible part of the stack.</p>
<h1 id="the-simplest-lead-generation-tool">The simplest lead generation tool</h1>
<p>The simplest tool on this list for a solo operator is probably <strong>Waalaxy</strong>.</p>
<p>It is cheap enough to test, easy enough to understand, and structured enough that a beginner can get a campaign live without needing a RevOps person, an API integration, or a minor religious commitment to Zapier.</p>
<p>If you do not actually need LinkedIn actions, then <strong>Evaboot</strong> is arguably even simpler: export, clean, verify, sequence.</p>
<p>That is often enough.</p>
<h1 id="legal-liabilities-of-linkedin-automation">Legal liabilities of LinkedIn automation</h1>
<p>This section matters more than the rankings.</p>
<p>I have written elsewhere in detail about whether scraping LinkedIn is legal in 2026. The short version is uncomfortable but useful:</p>
<ul>
<li>public scraping is <strong>not automatically criminal</strong> after the hiQ line of cases,</li>
<li>but building a business on LinkedIn-derived data is still <strong>not safe</strong>,</li>
<li>LinkedIn’s <strong>contract terms</strong> create separate risk from the narrow CFAA discussion,</li>
<li>and even if you think your legal theory is strong, that does not make the business durable.</li>
</ul>
<p>I am not saying this as an armchair commentator. I was sued by LinkedIn. Proxycurl and I settled. That experience changed my view.</p>
<p>The practical issue is not just "can you win an internet argument about public pages?"</p>
<p>The practical issue is:
- can LinkedIn send legal pressure,
- can they frame a contract claim,
- can they ask for deletion of downstream data,
- can they drag your customers into the blast radius,
- and can they make your founder life worse for long enough that the whole thing stops being worth it?</p>
<p>That answer is yes.</p>
<p>Even outside the lawsuit layer, users are constantly dealing with lower-level enforcement like warnings, restrictions, and identity checks.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">@LinkedInHelp My account was restricted with no explanation.

I've submitted my government ID through Persona, raised multiple tickets and completed every step asked of me.

I created a ticket through a separate email as the banned account email won't work on your forms.

Support keeps sending me to forms that won't submit because the account is restricted. Going in circles.

I've completed everything they've asked - only to be told it has to come from the email on the account, even though I can't submit a ticket from it because it's restricted.

Can someone actually look into this instead of sending me in circles constantly?</p>&mdash; Sohaib Ashraf (@Sohaibashraf97) <a href="https://x.com/Sohaibashraf97/status/2056010317944004752?ref=nubela.co">Sun May 17 13:53:53 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That tweet is not proof of automation enforcement by itself. I am not claiming it is.</p>
<p>What it does show is the operational reality: once a LinkedIn account is restricted, getting human resolution can be painful. If your outbound machine depends on that account, the damage is immediate whether or not you think the restriction was fair.</p>
<p>My strongest advice in 2026 is very simple:</p>
<p><strong>Do not build your core GTM engine on top of behavior LinkedIn explicitly does not want.</strong></p>
<h1 id="bonus-alternative-ninjapear">Bonus alternative: NinjaPear</h1>
<p>This is the update that mattered most for this article.</p>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is <strong>not</strong> a LinkedIn automation tool. It is a B2B competitive intelligence and data platform.</p>
<p>That is exactly why it belongs here as a bonus alternative.</p>
<p>A lot of teams use LinkedIn automation because they want four outcomes:
- better prospect lists,
- fresher account context,
- the right buyers at the right companies,
- and a reason to reach out now.</p>
<p>NinjaPear gets you most of that without automating LinkedIn actions or scraping LinkedIn.</p>
<p>What it gives you instead:
- <strong>Customer API</strong>: see who any vendor sells to
- <strong>Competitor API</strong>: identify competitors with evidence and confidence scores
- <strong>Employee API</strong>: build person profiles from public sources
- <strong>Company API</strong>: company details, employee count, funding, updates
- <strong><a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a></strong>: track company blog posts, X posts, and website changes as one RSS feed
- <strong><a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a></strong>: spreadsheet workflow to pull competitors, customers, employees, and work emails</p>
<p>How I would use NinjaPear for lead generation:
1. start with a target account or competitor,
2. pull competitors or customer lists,
3. find the right people inside those accounts,
4. enrich with work emails,
5. monitor account changes so outreach is tied to timing, not just title matching.</p>
<p>That last step is the important one.</p>
<p>Most LinkedIn automation tries to solve volume. NinjaPear is much better at solving <strong>relevance</strong>.</p>
<p>And relevance is what actually gets replies.</p>
<p>When I was running FluxoMetric years ago, I wasted ~months messing around with tools that made me feel productive because dashboards were moving. The problem was not activity. The problem was timing and context. If I had a feed telling me a prospect account had changed pricing, launched a new product, started hiring a new function, or published a new initiative, my outreach got easier immediately.</p>
<p>That is what products like NinjaPear are built for.</p>
<h1 id="conclusion">Conclusion</h1>
<p>The best LinkedIn automation tools for lead generation in 2026 are not all solving the same problem.</p>
<p>If you want direct LinkedIn action automation, start with <strong>Dux-Soup</strong> or <strong>Waalaxy</strong>.</p>
<p>If you want multichannel outreach, look at <strong>Reply.io</strong> or <strong>Meet Alfred</strong>.</p>
<p>If you want Sales Navigator extraction and cleanup, <strong>Evaboot</strong> is one of the cleaner options.</p>
<p>If you want verified contact data without depending on LinkedIn actions, <strong>UpLead</strong> and <strong>Lusha</strong> are stronger bets.</p>
<p>And if you are thinking one level deeper, which I think you should, the better question is not "which LinkedIn automation tool should I buy?" It is: <strong>how much of my pipeline engine can I move away from LinkedIn dependency altogether?</strong></p>
<p>That is the direction I would push.</p>
<p>If you are still testing LinkedIn automation, keep volumes sane, keep workflows tight, and do not confuse activity with pipeline. If you want a more durable path, try NinjaPear’s free trial and see whether customer intel, company monitoring, and public-web enrichment get you the same wins with fewer legal and platform risks.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Does Proxycurl&#x27;s LinkedIn API pull contact information from LinkedIn profiles? ]]></title>
        <description><![CDATA[ No. Proxycurl&#39;s LinkedIn API did not pull contact information from LinkedIn profiles, for a very simple reason: public LinkedIn profiles do not expose that contact information in the first place.







r/coldemail
u/Majestic_Hornet_4194
· ▲ 1



No, you can’t legitimately get the email they used to ]]></description>
        <link>https://nubela.co/blog/does-proxycurls-linkedin-api-pull-contact-information-from-linkedin-profiles-2/</link>
        <guid isPermaLink="false">65faa8768cc97e0001c8a48b</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Sat, 28 Jun 2025 17:31:12 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_436.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>No. Proxycurl's LinkedIn API did <strong>not</strong> pull contact information from LinkedIn profiles, for a very simple reason: public LinkedIn profiles do not expose that contact information in the first place.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Majestic_Hornet_4194</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">No, you can’t legitimately get the email they used to sign up for LinkedIn from a profile URL. LinkedIn doesn’t expose it, and anything claiming to pull signup emails is either guessing, using leaked data, or violating policies.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1rqqldb/how_to_get_email_from_just_the_linkedin_url/o9un6zk/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<blockquote>
<p><strong>Important update:</strong> Proxycurl is sunset. This post stays up because people still search for old Proxycurl FAQs, but Proxycurl itself is no longer the relevant product. If what you actually want is a verified work email, use NinjaPear's <a href="https://nubela.co/docs?ref=nubela.co#work-email-endpoint">Work Email Endpoint</a> instead. Old Proxycurl demos, code samples, and product links are no longer the right place to start.</p>
</blockquote>
<p>That was true when Proxycurl was around, and it is still true now.</p>
<p>If your question is literal, "does Proxycurl pull contact information from LinkedIn profiles?", the answer is <strong>no</strong>.</p>
<p>Proxycurl only worked with public LinkedIn profile data. Public profiles generally give you things like:</p>
<ul>
<li>Name</li>
<li>Headline</li>
<li>Work history</li>
<li>Education</li>
<li>Public profile URL</li>
</ul>
<p>They do <strong>not</strong> give you the person's private contact details.</p>
<p>So if the data is not present on the public profile page, no API built around that page can honestly claim to return it <em>from LinkedIn</em>.</p>
<p>If what you actually want is a <strong>work email</strong>, the modern answer is NinjaPear's <a href="https://nubela.co/docs?ref=nubela.co#work-email-endpoint">Work Email Endpoint</a>.</p>
<p>This is an important distinction.</p>
<p>It does <strong>not</strong> mean, "take a LinkedIn URL and reveal hidden contact info from LinkedIn."</p>
<p>It means: use NinjaPear's data pipeline to find a person's <strong>work email</strong> from public web signals and company context.</p>
<p>That is a very different thing.</p>
<p>And frankly, it is the only sane way to talk about this without blurring the line between enrichment and fantasy.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Accountgram (by the Proxycurl team) ]]></title>
        <description><![CDATA[ Update / Shutdown Notice


Accountgram is no longer available.


Also, Proxycurl API has been sunset. I am the founder behind Proxycurl, and today my full-time focus is NinjaPear, which is profitable and where all of our energy now goes.


I am preserving this post because the original problem was real, the ]]></description>
        <link>https://nubela.co/blog/introducing-accountgram-by-the-proxycurl-team/</link>
        <guid isPermaLink="false">67c05533564af000015e9edb</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Thu, 27 Feb 2025 20:08:46 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_435.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<blockquote>
<p><strong>Update / Shutdown Notice</strong></p>
<p>Accountgram is no longer available.</p>
<p>Also, Proxycurl API has been sunset. I am the founder behind Proxycurl, and today my full-time focus is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is profitable and where all of our energy now goes.</p>
<p>I am preserving this post because the original problem was real, the economics were real, and the lessons still matter.</p>
</blockquote>
<p>I'm happy to share that the team behind Proxycurl is launching <a href="https://accountgram.com/?ref=nubela.co">Accountgram</a> today! <strong>Update:</strong> Accountgram is no longer available, but I am leaving the original launch post below mostly intact for posterity. The problem it addressed was very real for us when we were running Proxycurl, before Proxycurl itself was sunset and before I moved my focus fully to NinjaPear.</p>
<p>Accountgram is a digital B2B debt collection service with a 32.5% success rate from 64 collections, and an average of 12 days to collection. Accountgram is the key that reduced our customer churn rate from 15% to 3%. We are able to accomplish this feat in Proxycurl by:</p>
<ol>
<li>Employing annual contracts, coupled with PAYG plans for casual or one-time use</li>
<li>Enforcing contracts with Accountgram</li>
</ol>
<p>With dramatically lower churn, growth on Proxycurl compounded exponentially to the tune of 250% per year.</p>
<hr />
<p>Accountgram enforces B2B collections with teeth in two additional ways beyond dunning, aka nagging:</p>
<ol>
<li>Public debt database, which leads to reputational consequences</li>
<li>Data-driven escalation to employees and possible vendors</li>
</ol>
<hr />
<p>Here's the thing. As a business owner, we have to deal with bad actors who breach long-term contracts on a whim. There is this decade-old 10M ARR company that sought huge discounts from us, claiming they hire a lot of Ukrainians affected by the war, and that they’re in it for the long term. I relented and gave them big discounts because they are big and surely would respect a contract, right?</p>
<p>Nope. They took our discounts, our data, built a prototype, decided it wasn't going to work, and then proceeded to ghost me. This is just one of many instances we have to deal with.</p>
<p>And it really grinds my gears because, for sums between $1 and $10,000, there just aren't any scalable ways to enforce these breached contracts. And these bad actors know. Our average sum to collect is $539 from customers who sign up for the 12-month plan with a monthly payment of $49, then block the card the next month after milking the discounted credits in the first month.</p>
<p>Small claims filing costs $850 in the Californian courts with the cheapest law firm. And nagging just does not work.</p>
<p>This is why we built Accountgram. There must be teeth in the collection process. We read through the regulatory scriptures of B2B debt collection in the US, and we employed every trick we can legally deploy that is both scalable and ethical.</p>
<hr />
<p>Today, Accountgram is no longer something you can sign up for, and Proxycurl is no longer the business I run. Proxycurl has been sunset. I am now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, profitably, full-time.</p>
<p>I am keeping this post up because I still believe the underlying lesson is correct: if you sell B2B subscriptions with contract terms, you need an enforcement mechanism that is actually credible. Otherwise, your contract is decorative.</p>
<p>If you were reading this because you wanted to use Accountgram, the honest answer is that you cannot. If you were reading this because you wanted to understand why we built it, the answer is simple: churn math, contract abuse, and the lack of scalable enforcement for small B2B debts.</p>
<p>If you want to see what I am working on now, take a look at <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. It is profitable, it has my full attention, and unlike Accountgram, it is very much alive.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Guide to B2B Collections ]]></title>
        <description><![CDATA[ As the CEO of Accountgram, a B2B debt collection specialist with 92 collections under my belt since June 2024, I want to provide you with a no-nonsense breakdown of everything I know about B2B collections. I’ll also show you exclusive receipts from a collection made by Atradius, a €2. ]]></description>
        <link>https://nubela.co/blog/ultimate-guide-to-b2b-collections/</link>
        <guid isPermaLink="false">67bd91a3564af000015e9ece</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 25 Feb 2025 17:48:22 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_434.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>As the CEO of Accountgram, a B2B debt collection specialist with 92 collections under my belt since June 2024, I want to provide you with a no-nonsense breakdown of everything I know about B2B collections. I’ll also show you exclusive receipts from a collection made by Atradius, a €2.5B revenue debt collection company.</p>
<blockquote>
<p><strong>Update:</strong> Proxycurl API has been sunset. I’m the founder behind Proxycurl, and my full-time focus is now <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is profitable and where I am spending all of my time building. Accountgram is also no longer available. I am keeping this guide up because the underlying collection advice still holds.</p>
</blockquote>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/02/Screenshot-2025-02-25-at-5.15.24-PM.png" /></p>
<p>First demand letter from Atradius</p>
<p>Before I begin, let me clarify that this entire guide primarily applies to the US, though most of it can be applied to other countries, except in the EU due to GDPR regulations. Also, I'm going to assume that you are a new CFO in a growing company. If not, you’d already know this stuff, and you shouldn’t be taking advice from the CEO of a budding debt collection startup.</p>
<p>In my opinion, the B2B collection process is akin to a sales process where your job is:</p>
<ol>
<li>to understand why your debtor is not making payments</li>
<li>to make him/her understand how he/she will stand to lose if payment isn’t made</li>
</ol>
<p>Most B2B collections are stuck in step 1. Short of legal action, they never progress to step 2, which is why most debt collection companies fail to provide meaningful collection results. But let’s not jump ahead of ourselves. Let’s go back to basics:</p>
<h2 id="how-are-b2b-collections-done">How Are B2B Collections Done?</h2>
<p>At a high level, the B2B collection process, whether by 1st party or 3rd party, is usually conducted as follows:</p>
<ol>
<li><strong>Dunning</strong></li>
<li>Send demand letter</li>
<li>Multiple avenues of contact, including phone calls, emails, or in-person visits</li>
<li><strong>Negotiation</strong></li>
<li><strong>Escalation</strong></li>
</ol>
<p>Let’s dive deeper.</p>
<h3 id="dunning">Dunning</h3>
<p>This is how the first dunning email from a multi-billion-dollar revenue <em>Atradius</em> looks:</p>
<blockquote>
<p>Your reference : <CENSORED><br />
Case Number : <CENSORED><br />
Outstanding Amount : <CENSORED> USD<br />
Re : <CENSORED><br />
Dear Sirs,<br />
We have been advised by <CREDITOR> that the amount shown above is overdue for payment and have been instructed to collect this debt, which may also include interest and additional collection costs.<br />
You will find enclosed a detailed statement of account. Please return the document to<br />
us duly signed and sealed with the notice “debt acknowledged”.<br />
We hereby demand payment of the full outstanding debt within 15 days following receipt<br />
of this letter into ATRADIUS COLLECTIONS bank account 00050-042390-001-45-USD SWIFT<br />
Code BNPASGSG BNP PARIBAS 20 COLLYER QUAY #01-01 049319 SINGAPORE, stating reference<br />
number <CENSORED>.<br />
If you prefer to pay by check, we instruct you to make the bank check(s) payable to<br />
ATRADIUS COLLECTIONS.<br />
To make payment we have created a personal account for you. Use this link and follow<br />
the instructions to login and make payment.<br />
<a href="https://www.atradius.com/debtor/login.do?token=&ref=nubela.co">https://www.atradius.com/debtor/login.do?token=</a><CENSORED><br />
We urge you to comply with our request in order to avoid any further costs or actions.  </p>
<p>If payment has already been made, please inform us immediately.<br />
Sincerely,  </p>
<p><CENSORED> Atradius Collections Pte Ltd Tel. : <CENSORED> <CENSORED>@atradius.com</p>
</blockquote>
<p>This is how we did it at Accountgram:</p>
<blockquote>
<p>Hi <DEBTOR>,  </p>
<p>I hope this email finds you well!  </p>
<p>We have noticed that your payment <strong>failed</strong> for the <strong>Prorated cancellation fee for the 12-month contract (Nov 2024 - Jul 2025)</strong>, which amounts to <strong>$392</strong>. Would you like to fix this by making a payment?  </p>
<p>If you need help with payment or have any questions at all, you can hit reply or email <a href="mailto:collection@accountgram.com">collection@accountgram.com</a>, and we will get back to you as soon as possible!</p>
</blockquote>
<hr />
<p>Dunning is a process used during B2B collection that involves systematically communicating with debtors through reminders to encourage them to settle outstanding debts. Personally, dunning is just a nicer way of saying <em>nagging</em>. The goal of dunning is to <em>get them to respond</em> and to understand why they are not paying.</p>
<p>Figure out where the customer is coming from, it could be a product/service problem, or they might be experiencing cashflow issues. In that case, you can either fix their issues or put them on a custom payment plan. These are the lowest-hanging fruits and the best possible outcomes because:</p>
<ul>
<li>You retain a happy, and potentially long-term, customer.</li>
<li>You get paid.</li>
</ul>
<h3 id="negotiation">Negotiation</h3>
<p>This is how negotiation looks:</p>
<p><strong>Creditor</strong>:</p>
<blockquote>
<p>There are still eight months remaining on the $49/month subscription, totaling $392. As an alternative, you may pay this amount upfront, and we can convert it into PAYG credits at PAYG rates. These credits will not expire unless the account remains inactive for 18 months. Please let us know if you would like to proceed with this option.</p>
</blockquote>
<p><strong>Debtor</strong>:</p>
<blockquote>
<p>Hey <CENSORED>! Thank you so much for this message and for walking us through this.  </p>
<p>You have a deal. We will pay the remaining $392 to close out of our $49/month agreement.  </p>
<p>Before we do that, can you please cancel our current monthly subscription of $299/month? It renews for the next month on Feb 20th.  </p>
<p>I don't want to be hit with paying $299 and then another $392 to end our agreement. If you can do that, that would be great. Thanks!</p>
</blockquote>
<hr />
<p>If you are lucky, the debtor will respond during the dunning process and explain why they’re not making payments. It’s often due to cashflow issues or dissatisfaction with the product/service. That’s where negotiation begins.</p>
<p>The debtor might propose a payment plan if they can’t pay in full right away. You’ll negotiate with the debtor on late fees, interest, total balance, or other terms if you authorize any concessions.</p>
<p>But what if the debtor is unreasonable or simply doesn’t respond?</p>
<h3 id="escalation">Escalation</h3>
<p>Bad actors know that dunning is, at worst, annoying. They figure you’re not going to sue them over something like $392. And they’re often right because between $1 and $10,000, there aren’t many options beyond a legal claim. Which is why we created Accountgram, to provide escalation options beyond just “nagging better.”</p>
<blockquote>
<p><strong>Update:</strong> Accountgram is no longer available. I have left these examples in because they show the mechanics of escalation clearly. The business itself is no longer operating, and my full-time focus is now NinjaPear.</p>
</blockquote>
<p>For most other agencies, “escalation” essentially means:</p>
<ol>
<li>Sending final notices or warnings of possible legal action.</li>
<li>Spending money to take legal action.</li>
</ol>
<p>And yes, I have taken legal action against bad actors who decided to interpret legal documents however they wanted. Here is the COO of a company doing $10M in ARR:</p>
<blockquote>
<p>Hi Steven,<br />
I followed your recommendation and had a lawyer review the sales agreement. He informed me that the agreement can be terminated after written notice, as stated in Article 5.1 of Section 5. Since this notice has already been sent, the agreement is now considered terminated.<br />
That's what the lawyer told me.</p>
</blockquote>
<p>This is Article 5.1/5.2 of Section 5:</p>
<blockquote>
<p>Termination for Breach: Either party can terminate the agreement on 30 days' notice if the other party materially breaches the agreement (or immediately if there is non-payment).<br />
Payment Obligation: Even if terminated early, the customer is still responsible for paying for the services provided up to the date of termination.</p>
</blockquote>
<p>I followed up more than 10 times with this COO, and he ghosted me. Until I spent the money and filed a small claim against his company. Shortly after serving notice of the legal claim, the CEO reached out:</p>
<blockquote>
<p>Hi Steven,  </p>
<p>I hope you're doing well. It was just a few days ago that it came to my attention you filed a claim to collect payment for the Q4 invoice of 2024.  </p>
<p>I was not aware of the situation regarding the cancellation, as this had been managed by my operations team. Only today did I see your correspondence with Nick and his ignoring of your follow-up email.  </p>
<p>Would you be open to jumping on a quick call to discuss this matter? I hope we can resolve it together.  </p>
<p>I could suggest tomorrow at 3 pm CET. Additionally, 12 am and any time from 3 pm to 5 pm CET work for me. I can also do Monday any time after 5 pm and Tuesday any time from 1 pm to 5 pm CET.</p>
</blockquote>
<hr />
<p>Yes, we collected the money, around $8000, including late fees. I was lucky the CEO was cooperative. If not, litigating and enforcing the collection might have cost more than $8000.</p>
<p>That’s the beauty of the old Accountgram approach. For sums between $1 and $10,000, there really isn’t a great way to escalate and collect. Accountgram provided an alternative path to escalation before legal action. Essentially, we posted debts publicly in our well search-optimized public debt database, causing reputational harm for debtors. If that didn’t work, we escalated to the debtor’s employees and relevant customers. We were able to do this thanks to our proprietary Global Customer Database, which mapped out a large portion of B2B relationships in the US.</p>
<p>If that last sentence sounds familiar, yes, that same obsession with relationship data is part of why I am now building NinjaPear. Different product. Same underlying belief that better business relationship data changes outcomes.</p>
<h2 id="collect-yourself">Collect Yourself</h2>
<p>You don’t have to hire a 3rd-party collection agency. For small sums below $10,000, most agencies will be reluctant to take the case anyway. You can do it yourself.</p>
<p>To collect a fresh bad debt, refer to the collection process I just detailed. I’ll summarize it here:</p>
<ol>
<li>Have your Accounts team send a demand letter, by email or post, to the debtor.</li>
<li>Follow up multiple times, each incremental dunning message should be firmer than the last.</li>
<li>Negotiate and, hopefully, finalize collection.</li>
<li>If ghosted or no concessions are offered, escalate by:</li>
<li>Posting the debt publicly on your company’s website, but ensure you’re not breaching any regulatory frameworks. You can’t do this for EU-based companies or individuals.</li>
<li>Reaching out to the debtor’s employees and vendors.</li>
<li>If the customer remains firm in not paying and the amount justifies it, engage legal counsel and file a civil lawsuit.</li>
</ol>
<p>That said, the old paragraph here used to pitch Accountgram. That is now outdated because Accountgram is no longer available. I am leaving the do-it-yourself process intact because it is still the useful part.</p>
<h2 id="pursuing-legal-action">Pursuing Legal Action</h2>
<p>Legal action is expensive. You should only consider it if the sum to be collected is far above the cost of legal fees and if it’s clearly not a disputed debt, with an obvious breach of contract. Apart from the “Accountgram method,” legal action is the only other approach with real teeth.</p>
<p>In this section, I’ll talk about Small Claims, focusing on the California jurisdiction. Here are the ideal requirements to file a small claim in California:</p>
<ol>
<li>Claim amount &lt;= $12,500</li>
<li>You can show up in court</li>
</ol>
<p>Don’t be like me, I couldn’t physically show up in a California court, which jacked up my legal costs. But if you meet the requirements above, the legal fees to file a small claim can be manageable. In my case, it was $850, around 10% of the owed sum.</p>
<p>I personally wouldn’t recommend going this route for most debts because it’s expensive, slow, and not guaranteed to result in actual collection. I sued one company because I was so incensed that they:</p>
<ol>
<li>Were making good money,</li>
<li>Had already received so many discounts and concessions from us,</li>
<li>And had a total disregard for the contract.</li>
</ol>
<p>I just had to do it.</p>
<p>I can’t give more advice on civil legal action beyond small claims because I don’t have experience there.</p>
<h2 id="third-party-debt-collection-agencies">Third-Party Debt Collection Agencies</h2>
<p><em>Bad debts are an irrefutable fact of any business.</em> So it makes sense to have a third-party debt collection component in your accounts receivables workflow. Here are a few options:</p>
<table>
<thead>
<tr>
<th><strong>Category</strong></th>
<th><strong>Pros</strong></th>
<th><strong>Cons</strong></th>
<th><strong>Most Suitable For</strong></th>
<th><strong>Pricing Model</strong></th>
<th><strong>Company Examples</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Debt Collection Software Platforms (SaaS)</strong></td>
<td>- Automates dunning (reminders via email, text, calls) - Structured, compliant A/R tracking - Great for high volume of small overdue accounts - Often integrates with existing A/R workflows</td>
<td>- Fixed cost (pay regardless of recovery) - Less effective for very large/complex debts - “Nagging” may not solve deeply overdue cases</td>
<td>Businesses with many small, overdue invoices needing repeated follow-ups</td>
<td>- Typically subscription-based (monthly/annual) - Sometimes usage-based</td>
<td>Tesorio, Gaviti, Upflow, etc.</td>
</tr>
<tr>
<td><strong>Debt Collection Big Corps (Trade Credit Insurance)</strong></td>
<td>- Guarantees invoice payouts (credit insurance) - Highly experienced in international and large-scale debt collection - Strong global networks</td>
<td>- Often more expensive, with premiums - Generally suited to larger enterprises - May require strict underwriting processes</td>
<td>Enterprises with broad customer bases, including international markets, wanting to insure large receivables exposure</td>
<td>- Credit insurance premiums (based on volume/amount)</td>
<td>Atradius, Euler Hermes, Coface</td>
</tr>
<tr>
<td><strong>Traditional Debt Collection Agencies</strong></td>
<td>- Expert at pursuing delinquent accounts - Often contingency-based (pay only if they recover) - Recognized as the “standard” option for debt collection</td>
<td>- Typically prefer high-value invoices - Might not scale for large volumes of smaller debts - Potentially higher fees (percentage of recovered debt)</td>
<td>SMBs with one or several large overdue accounts, or any business wanting hands-off collection on major outstanding debt</td>
<td>- Primarily contingency-based (percentage of recovered amounts) - Some may also offer fixed-fee or mixed models</td>
<td>IC System, ABC-Amega, Transworld Systems Inc, Midland Credit Management</td>
</tr>
<tr>
<td><strong>Accountgram</strong></td>
<td>- Combined traditional agency tactics with SaaS automation - Data-driven escalation, including public debt disclosure - 31.25% success rate - No discrimination on invoice amounts</td>
<td>- Public debt disclosure could affect customer relationships - Smaller brand recognition compared to global credit insurers - No longer available</td>
<td>Tech-native SMBs and mid-market companies that, at the time, wanted both automation and stronger escalation</td>
<td>- Performance-based fee structure</td>
<td>Accountgram (sunset)</td>
</tr>
</tbody>
</table>
<h3 id="debt-collection-software-platforms-saas">Debt Collection Software Platforms (SaaS)</h3>
<p>These platforms are typically software that automates the dunning process, reminder emails, texts, calls, and tracks accounts receivable in a structured, compliant manner. Examples include Tesorio, Gaviti, Upflow, and others. In general, these platforms help you “nag better.” And nagging does work to some extent.</p>
<p>These platforms suit situations with a high volume of small overdue accounts. The drawback is you have to pay to use them regardless of whether they successfully collect the debt.</p>
<p>Some examples of Debt Collection Software Platforms: Tesorio, Gaviti, Upflow, and others.</p>
<h3 id="debt-collection-big-corps">Debt Collection Big Corps</h3>
<p>The big boys of debt collection are essentially large corporations offering <em>Trade Credit Insurance</em>, which guarantees payouts from invoices you issue. For these companies, debt collection is core because they need to claw back funds on bad invoices that they’ve already insured.</p>
<p>Enterprises usually have their revenue insured because <em>bad debts are an irrefutable fact of any business</em>. They pay a small premium on each invoice to credit insurance companies like Atradius, who will pay out on bad invoices, but also try to claw them back afterward.</p>
<p>Credit insurance companies include names like Atradius, Euler Hermes, and Coface. They’re suitable for larger businesses with broad customer bases, including international markets with significant receivables exposure.</p>
<h3 id="traditional-debt-collection-agencies">Traditional Debt Collection Agencies</h3>
<p>These agencies specialize in pursuing delinquent accounts on your behalf, often on a contingency basis, they take a percentage of what’s recovered. For most people, this is what comes to mind when they think of debt collection.</p>
<p>They’re generally experts in collection tactics, but they tend to prefer high-value invoices. These agencies are suitable for SMBs that have a single large overdue account. However, they don’t typically scale well within an overall accounts receivable workflow.</p>
<p>Some examples of traditional debt collection agencies: IC System, ABC-Amega, Transworld Systems Inc, Midland Credit Management.</p>
<h3 id="accountgram">Accountgram</h3>
<p>Accountgram combined the efficacy and escalatory tactics of traditional debt collection with the scalability and efficiency of debt collection software. We used software automation for efficiency and data-driven escalation tactics to spur higher success rates. Strategies like public debt disclosure and direct notifications to customers and employees gave Accountgram a debt collection success rate of 31.25%.</p>
<p>We also didn’t discriminate based on invoice amounts.</p>
<p>That said, Accountgram is no longer available. I am retaining this section because it explains the positioning clearly, and because a lot of the tactical thinking here came from the same founder brain that earlier built Proxycurl and is now building NinjaPear.</p>
<h2 id="final-note">Final Note</h2>
<p>The old ending of this article used to be a direct call to try Accountgram. That is no longer accurate, so I’m not going to pretend otherwise.</p>
<p>What is still true is that I learnt a lot doing collections. Enough to know that data on business relationships matters far more than most operators think. Proxycurl API has been sunset, Accountgram is no longer available, and I’m now working full-time on <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is profitable and very much alive.</p>
<p>If you came here for B2B collections, use the process in this guide. If you came here because you followed my work from Proxycurl, that chapter is over too. I’m building NinjaPear now.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Why Is There a Double Opt-In for a 12-Month Subscription Commitment? ]]></title>
        <description><![CDATA[ Our double opt-in process guarantees complete transparency before you commit to the 12-month subscription. With this step, we&#39;re assured that you understand and agree with the terms, before finalizing your purchase.

To proceed, review the terms before accepting them by checking the box. Only after you tick the ]]></description>
        <link>https://nubela.co/blog/why-is-there-a-double-opt-in-for-a-12-month-subscription-commitment/</link>
        <guid isPermaLink="false">67935e31f465ad000185475d</guid>
        <category><![CDATA[ subscription ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 24 Jan 2025 17:48:05 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Our double opt-in process guarantees complete transparency before you commit to the 12-month subscription. With this step, we're assured that you understand and agree with the terms, before finalizing your purchase. </p><p>To proceed, review the terms before accepting them by checking the box. Only after you tick the box,  will the 'Buy' button become active.</p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/01/image-2.png" class="kg-image" alt="" loading="lazy" width="1130" height="350"></figure><p>Once you click 'Buy', we'll again need you to confirm that your understand your commitment to a 12-month contract.</p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/01/image-3.png" class="kg-image" alt="" loading="lazy" width="1408" height="324"></figure><p>We've put these steps in place to ensure complete clarity, so there’s no confusion between <strong>what you’re signing up for</strong> and <strong>what you expect</strong>. With the double opt-in feature, you have an added opportunity to fully understand your commitments before completing your purchase. </p><p>At Proxycurl, we abide by our transparent terms and pricing policies, because we value building long-term relationships.</p><p>For more details, check out our full <a href="https://nubela.co/proxycurl/12-month-sales-agreement?ref=nubela.co" rel="noopener">12-Month Sales Agreement</a>.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ 17 Best B2B Data Providers in 2026 ]]></title>
        <description><![CDATA[ Find the 17 best free and paid B2B data providers in 2025, with a complete free guide on B2B data. ]]></description>
        <link>https://nubela.co/blog/top-b2b-data-providers/</link>
        <guid isPermaLink="false">67904e5b7193930001af857b</guid>
        <category><![CDATA[ b2b data ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Wed, 22 Jan 2025 12:00:26 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_432-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>After testing, buying, and in some cases building against these tools for years, I’d put <strong>NinjaPear, Lusha, and ZoomInfo</strong> at the top of the shortlist for <strong>B2B data providers</strong> in 2026, but for very different reasons. If you want competitive intelligence data nobody else really has, <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is the interesting one. If you want straightforward contact data, the tradeoffs start fast. That is the real problem with most "best B2B data providers" lists, they pretend one winner exists for every workflow.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/RandomRedditGuy69420</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Ask for samples from each to test for the vertical you sell into. That’s the only sure fire way to really know. That said, some combination is likely the best. The biggest orgs use multiple for a reason, specifically that nobody has it all.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/comments/1gmxw90/who_are_the_best_data_providers/lw7jiyu/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>A lot of older readers still land here looking for Proxycurl, so I should say this plainly.</p>
<blockquote>
<p><strong>Proxycurl has been sunset.</strong> I built Proxycurl, and a lot of the reasoning in the original version of this article came from that experience. I am now working on NinjaPear, which is a different product direction focused much more heavily on competitive intelligence, customer data, company monitoring, and public-web enrichment. I am retaining the original Proxycurl section below because people still search for it, but do read it as legacy context, not as a current recommendation you can newly adopt.</p>
</blockquote>
<p>I am not going to pretend all <strong>B2B data providers</strong> do the same job. They do not. Some are basically contact databases. Some are sales workflow wrappers around a contact database. A few are actually data infrastructure.</p>
<h2 id="what-matters-now">What matters now</h2>
<p>When I was running FluxoMetric, I burned ~${4}K/mo on tools that gave me worse data than a free Chrome extension. My mistake was assuming breadth meant quality. It usually meant bigger marketing copy.</p>
<p>What actually matters when you compare B2B data providers:</p>
<ul>
<li><strong>Freshness:</strong> Is the provider working from static monthly dumps, periodic re-verification, or live retrieval?</li>
<li><strong>Coverage by ICP:</strong> A tool that looks great for US SaaS can fall apart in manufacturing, APAC, or mid-market services.</li>
<li><strong>Context depth:</strong> Contact info alone is not enough if your workflow depends on buying signals, competitor moves, org changes, or customer overlap.</li>
<li><strong>Exportability:</strong> If the data only works nicely inside the vendor’s own UI, that is a tax.</li>
<li><strong>Pricing model:</strong> Seat-based pricing and credit-based pricing behave very differently once your team starts doing volume.</li>
</ul>
<p>That is the lens I’d use on every provider below.</p>
<h2 id="types-of-b2b-data">Types of B2B data</h2>
<p>The original article had an image here. It broke. Frankly, a table is better anyway.</p>
<table>
<thead>
<tr>
<th>Data Type</th>
<th>What It Includes</th>
<th>Where It Helps</th>
<th>Common Failure Mode</th>
</tr>
</thead>
<tbody>
<tr>
<td>Demographic</td>
<td>Name, role, location, seniority</td>
<td>Persona targeting, routing, lead scoring</td>
<td>Wrong person, stale title</td>
</tr>
<tr>
<td>Firmographic</td>
<td>Industry, company size, revenue, HQ, ownership</td>
<td>ICP filtering, segmentation, TAM building</td>
<td>Modeled revenue, outdated headcount</td>
</tr>
<tr>
<td>Technographic</td>
<td>Installed tools, stack signals, web technologies</td>
<td>Competitive displacement, dev-tool targeting</td>
<td>False positives from stale crawls</td>
</tr>
<tr>
<td>Chronographic</td>
<td>Funding, hiring bursts, leadership changes, office openings</td>
<td>Timing outreach, account prioritization</td>
<td>Event lag, missed smaller changes</td>
</tr>
<tr>
<td>Intent</td>
<td>Research behavior, topic consumption, buyer signals</td>
<td>Prioritization, campaign timing</td>
<td>Black-box scoring with weak explainability</td>
</tr>
<tr>
<td>Fit</td>
<td>Match against your ICP rules</td>
<td>Qualification, routing</td>
<td>Oversimplified scoring</td>
</tr>
<tr>
<td>Opportunity</td>
<td>Product launches, expansion moves, M&amp;A, new pages</td>
<td>Account planning, competitive intel</td>
<td>Sparse coverage outside large accounts</td>
</tr>
<tr>
<td>Behavioral</td>
<td>Site activity, product usage, campaign engagement</td>
<td>Nurture, upsell, lifecycle automation</td>
<td>Usually first-party only</td>
</tr>
<tr>
<td>Interaction</td>
<td>Calls, emails, meetings, touch history</td>
<td>Rep context, pipeline management</td>
<td>Lives inside CRM silos</td>
</tr>
<tr>
<td>Attitudinal</td>
<td>Reviews, survey sentiment, customer opinions</td>
<td>Messaging, positioning, product marketing</td>
<td>Hard to normalize at scale</td>
</tr>
<tr>
<td>Contact Data</td>
<td>Work emails, phone numbers, social handles</td>
<td>Outbound, enrichment, recruiting</td>
<td>Highest decay rate of the lot</td>
</tr>
</tbody>
</table>
<p>If your team says it needs "data," force the question. <strong>What kind?</strong> Most buying mistakes happen right there.</p>
<h2 id="sources-of-b2b-data">Sources of B2B data</h2>
<p>Same issue here. The old image is gone, and again, a table says more.</p>
<table>
<thead>
<tr>
<th>Source</th>
<th>What You Get</th>
<th>Best Use</th>
<th>Constraint</th>
</tr>
</thead>
<tbody>
<tr>
<td>Public web</td>
<td>Company pages, leadership bios, blog posts, pricing pages, customer logos</td>
<td>Competitive intelligence, enrichment, monitoring</td>
<td>Requires extraction and constant refresh</td>
</tr>
<tr>
<td>First-party forms</td>
<td>Emails, role info, declared interest</td>
<td>Inbound qualification</td>
<td>Narrow coverage</td>
</tr>
<tr>
<td>CRM history</td>
<td>Closed-won patterns, reply rates, touch history</td>
<td>Scoring, territory planning</td>
<td>Messy if CRM hygiene is poor</td>
</tr>
<tr>
<td>Product usage</td>
<td>Activation events, seat growth, feature adoption</td>
<td>PLG sales, expansion</td>
<td>Only useful if you own the product data</td>
</tr>
<tr>
<td>Third-party providers</td>
<td>Contacts, firmographics, technographics, intent</td>
<td>Prospecting and enrichment</td>
<td>Quality varies wildly by segment</td>
</tr>
<tr>
<td>Browser extensions</td>
<td>On-page lookup and quick capture</td>
<td>SDR workflow speed</td>
<td>Often thin outside supported pages</td>
</tr>
<tr>
<td>Surveys/interviews</td>
<td>Qualitative fit and pain points</td>
<td>Market research, messaging</td>
<td>Not scalable for list building</td>
</tr>
<tr>
<td>Company records</td>
<td>Registries, filings, legal entities</td>
<td>Verification, parent-child mapping</td>
<td>Slow-moving and uneven by country</td>
</tr>
<tr>
<td>Events/conferences</td>
<td>Attendance, sponsor, exhibitor signals</td>
<td>Partnering and outbound lists</td>
<td>Often expensive and incomplete</td>
</tr>
<tr>
<td>Web scraping</td>
<td>Structured extraction from sites</td>
<td>Coverage where no API exists</td>
<td>Maintenance and compliance burden</td>
</tr>
</tbody>
</table>
<p>This is also why no single provider wins everything. They are pulling from different substrates.</p>
<h2 id="constraints-of-b2b-databases">Constraints of B2B databases</h2>
<p>B2B databases are useful. They are not magic.</p>
<p>The big constraints are still the same:</p>
<ul>
<li><strong>Decay is real:</strong> Job changes, reorgs, domain changes, and layoffs break records constantly.</li>
<li><strong>The best data is uneven:</strong> One provider can be excellent for direct dials and weak on international coverage. Another can be great on company signals and bad on contacts.</li>
<li><strong>Pricing gets weird fast:</strong> Cheap self-serve plans often turn into expensive workflow bottlenecks once you need API access, bulk export, or more than a few seats.</li>
<li><strong>Compliance is not a footnote:</strong> If a provider’s sourcing model gets challenged, you inherit migration pain even if you are not the one collecting the data.</li>
<li><strong>Workflow fit matters as much as record quality:</strong> I’ve seen teams buy strong data and still fail because the exports, CRM sync, or API ergonomics were miserable.</li>
</ul>
<p>Gartner has estimated poor data quality costs organizations an average of <strong>$15 million per year</strong>. I believe that number because I’ve seen how quickly bad routing and bad enrichment compound into pipeline fiction.</p>
<h2 id="key-buying-metrics">Key buying metrics</h2>
<p>Here are the five metrics I would judge <strong>B2B data providers</strong> on before signing anything.</p>
<h3 id="data-freshness">Data freshness</h3>
<p>Freshness is not a marketing adjective. It is an operating variable.</p>
<p>If you are pulling job changes, leadership shifts, or pricing-page updates, monthly refreshes are not enough. If you only need company name normalization, cache is fine. The right question is not "is it fresh?" The right question is <strong>fresh enough for what</strong>.</p>
<h3 id="data-points">Data points</h3>
<p>I care less about inflated field counts and more about whether the fields matter.</p>
<p>A vendor telling you they have 200+ attributes does not impress me if 40 of those are address fragments and 20 are null half the time. I would rather have 25 fields that actually change decisions.</p>
<h3 id="integration-options">Integration options</h3>
<p>If the data provider cannot fit your stack, it becomes a side quest.</p>
<p>For small teams, CSV export and browser workflows might be enough. For serious ops teams, you want API quality, predictable schemas, and low-friction CRM sync.</p>
<h3 id="legal-compliance">Legal compliance</h3>
<p>I learned this one the hard way over the years. If the sourcing model is shaky, your integration has a shelf life whether you like it or not.</p>
<p>At minimum, I want plain language on sourcing, privacy posture, and what the provider does <strong>not</strong> do.</p>
<h3 id="pricing">Pricing</h3>
<p>Credit pricing is not better than seat pricing. Seat pricing is not better than credit pricing. It depends on usage shape.</p>
<p>If your reps prospect manually all day, seat pricing can make sense. If you are enriching records programmatically or monitoring accounts in bursts, usage-based pricing can be much cleaner.</p>
<h2 id="17-best-b2b-data-providers">17 best B2B data providers</h2>
<p>Before the long breakdown, here is the quick comparison. I wish more articles did this plainly instead of hiding the useful bit 3,000 words down.</p>
<table>
<thead>
<tr>
<th>Provider</th>
<th>Best For</th>
<th style="text-align: right;">Data Quality</th>
<th style="text-align: right;">Pricing</th>
<th style="text-align: right;">Ease of Use</th>
<th style="text-align: right;">API</th>
<th style="text-align: right;">Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear</td>
<td>Competitive intelligence + enrichment</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">4.00/5</td>
</tr>
<tr>
<td>Lusha</td>
<td>Fast contact lookup</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.50/5</td>
</tr>
<tr>
<td>Sales Navigator</td>
<td>Native prospecting workflow</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">3.00/5</td>
</tr>
<tr>
<td>Datanyze</td>
<td>Technographics on a budget</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>People Data Labs</td>
<td>Large structured datasets</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>Lead411</td>
<td>SMB outbound teams</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.50/5</td>
</tr>
<tr>
<td>RocketReach</td>
<td>Email lookup workflows</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>LeadIQ</td>
<td>SDR workflow + capture</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>Clearbit</td>
<td>HubSpot-centric enrichment</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.00/5</td>
</tr>
<tr>
<td>SalesIntel</td>
<td>Verified direct dials</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>UpLead</td>
<td>Small-team prospecting</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.50/5</td>
</tr>
<tr>
<td>Owler</td>
<td>Company tracking</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>Apollo.io</td>
<td>Cheap volume for outbound</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.50/5</td>
</tr>
<tr>
<td>Coresignal</td>
<td>Bulk datasets</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td>Enterprise contact data</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">3.25/5</td>
</tr>
<tr>
<td>Data Axle</td>
<td>Segmentation-heavy use cases</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.00/5</td>
</tr>
<tr>
<td>Hunter.io</td>
<td>Email discovery</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">3.50/5</td>
</tr>
</tbody>
</table>
<h3 id="1-ninjapear-best-new-alternative">1. NinjaPear, best new alternative</h3>
<p>This is the one I would add if I were updating this list for 2026, because I literally had to. Proxycurl is no more, and the founder behind Proxycurl is now building NinjaPear.</p>
<p>NinjaPear is not trying to be yet another giant contact database with slightly different branding. The product direction is different. It focuses on competitive intelligence, customer listing data, company monitoring, competitor mapping, company profiles, employee profiles, and work email enrichment from public web sources.</p>
<p>That matters because a lot of teams do not just need "a contact." They need context. Who does this vendor sell to? Who are its competitors? What changed on the company website this week? What new pricing page appeared yesterday? That is the kind of live-market picture most old-school B2B data providers do a bad job of giving you.</p>
<ul>
<li><strong>Data Freshness:</strong> NinjaPear mixes live retrieval with usage-based endpoints. The <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a> tracks blogs, website changes, and X posts for any company and turns them into an RSS feed.</li>
<li><strong>Data Points:</strong> Customer listing, competitors, person profiles, company profiles, work emails, employee count, and company updates.</li>
<li><strong>Integrations:</strong> API-first, JSON in and JSON out, plus <a href="https://nubela.co/companies?ref=nubela.co">NinjaPear for Claude</a> and <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> for spreadsheet-style workflows.</li>
<li><strong>Legal Compliance:</strong> Built around public-web sourcing, not gated social-network scraping.</li>
</ul>
<p><strong>NinjaPear Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>3-day free trial, 10 credits included, no credit card required ✅</td>
</tr>
<tr>
<td>Paid model</td>
<td>Usage-based credits</td>
</tr>
<tr>
<td>Subscription note</td>
<td>Monthly and annual plans are available, with lower credit rates for predictable usage</td>
</tr>
</tbody>
</table>
<p><strong>NinjaPear Pros and Cons</strong></p>
<p><strong>Pros:</strong></p>
<ul>
<li>Different category of value from the usual contact-database crowd.</li>
<li>Customer API and Competitor API are genuinely useful for market mapping.</li>
<li>Company monitoring across blog, X, and website changes is unusually practical.</li>
<li>Free tools like Company Logo API are actually nice touches.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>If all you want is a giant static CSV of contacts, this is not the most obvious fit.</li>
<li>Usage-based credits require a bit more thought than simple seat pricing.</li>
</ul>
<p><strong>TLDR Verdict</strong></p>
<p>If your definition of B2B data includes competitive intelligence and company-change signals, not just names plus emails, NinjaPear deserves to be on the shortlist.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales_intelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Cute-Individual4472</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Interesting results - this matches what I’ve seen running similar tests. Coverage is super uneven and provider “A” vs “B” often flips depending on segment and region, especially in mid‑market. In my case, Apollo + Lusha together beat ZoomInfo/Cognism on raw email coverage for SaaS in NA/EU, but ZoomInfo was stronger on org charts and phone...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales_intelligence/comments/1rp8c4b/comparing_contact_coverage_across_lusha_apollo/o9nfpdh/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h3 id="2-proxycurl-legacy-pick-now-sunset">2. Proxycurl, legacy pick now sunset</h3>
<p>A developer-focused B2B data provider, with a huge portfolio of API endpoints, Proxycurl enriched the data of people and companies with a variety of up-to-date data points.</p>
<p>Depending on your use cases, Proxycurl's APIs could be integrated into existing applications and workflows. With a database of over 500M people and company profiles, it used to be one of the stronger developer-first options in the category.</p>
<ul>
<li><strong>Important update:</strong> Proxycurl API has been sunset. I am retaining this section because the original article ranked it first and many readers still search for it by name. But you cannot read this section as an up-to-date buying recommendation. The founder behind Proxycurl is now building NinjaPear.</li>
<li><strong>Data Freshness:</strong> Proxycurl provided flexibility in choosing data freshness.</li>
<li><strong>Data Points:</strong> Proxycurl offered various datapoints of individuals or companies, including phone numbers, personal and work emails, funding data, industry data, social media profiles, and past/current employment details.</li>
<li><strong>Integrations:</strong> API-first, JSON responses, and easy integration into existing workflows.</li>
<li><strong>Legal Compliance:</strong> Followed GDPR and CCPA regulations.</li>
</ul>
<p><strong>Proxycurl Pricing</strong></p>
<p>Legacy reference only. No longer relevant for new buyers.</p>
<p><strong>Pros:</strong></p>
<ul>
<li>Fresh profile data at the time.</li>
<li>Good flexibility in data freshness.</li>
<li>Strong developer ergonomics.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Sunset product.</li>
</ul>
<p><strong>TLDR Verdict</strong></p>
<p>Useful historical context. Not a live buying option in 2026. Look at NinjaPear instead if you were originally here for Proxycurl.</p>
<h3 id="3-lusha-still-a-strong-contact-data-pick">3. Lusha, still a strong contact-data pick</h3>
<p><a href="https://www.lusha.com/?ref=nubela.co">Lusha</a> sells access to its B2B database where businesses can find verified contact details. You can locate potential business partners and establish communication with them. It also plays nicely with a number of CRM and advertising systems.</p>
<p>Through the contact and business lookup functions, you can access up to one thousand contacts and businesses with a single inquiry. It works as both a Chrome extension and through an API.</p>
<ul>
<li><strong>Data Freshness:</strong> Lusha updates their databases in real-time.</li>
<li><strong>Data Points:</strong> Contact info and business data points like annual revenue, business type, employee count, and location.</li>
<li><strong>Integrations:</strong> Lusha integrates with 1200+ apps.</li>
<li><strong>Legal Compliance:</strong> Lusha is CCPA and GDPR compliant.</li>
</ul>
<p><strong>Lusha Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free plan available ✅</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$49/person/mo</td>
</tr>
<tr>
<td>High-end paid</td>
<td>Customizable usage and price</td>
</tr>
</tbody>
</table>
<p><strong>Pros:</strong></p>
<ul>
<li>Reasonable pricing for the quality of data it provides.</li>
<li>Interactive dashboard.</li>
<li>Chrome extension is convenient.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Instances of wrong information being served.</li>
<li>Value depends a lot on your region and ICP.</li>
</ul>
<p><strong>TLDR Verdict</strong></p>
<p>Still one of the better mid-market picks if you want a fast contact-data workflow without going full enterprise.</p>
<h3 id="4-sales-navigator">4. Sales Navigator</h3>
<p><a href="https://business.linkedin.com/sales-solutions/sales-navigator?ref=nubela.co">Sales Navigator</a> is still one of the most practical prospecting tools if your workflow starts inside LinkedIn and stays there. You get strong search filters, account tracking, lead tracking, and native workflow familiarity.</p>
<p>The problem is the same as it has always been. Access is easier than the official API route, but the data is still mostly useful inside LinkedIn's own walls unless you layer something else on top.</p>
<ul>
<li><strong>Data Freshness:</strong> Straight from the source, so updates are timely.</li>
<li><strong>Data Points:</strong> Strong lead and account search context.</li>
<li><strong>Integrations:</strong> Limited compared with open API-first providers.</li>
<li><strong>Legal Compliance:</strong> Native platform data source.</li>
</ul>
<p><strong>Sales Navigator Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Sales Navigator</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>No free version ❌</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>Core, $99/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Advanced Plus, pricing varies by team setup</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Excellent workflow product. Less excellent if you need open, portable, workflow-friendly data outside the platform.</p>
<h3 id="5-datanyze">5. Datanyze</h3>
<p><a href="https://www.datanyze.com/?ref=nubela.co">Datanyze</a> enriches prospect profiles while you're browsing and leans heavily into technographics.</p>
<p>It uses web crawlers to identify a company's technology stack and usage, which helps you identify potential customers. That part is still useful. If you sell dev tools, martech, or infra, technographic slices can be the difference between a relevant list and a useless one.</p>
<ul>
<li><strong>Data Freshness:</strong> Refreshed frequently.</li>
<li><strong>Data Points:</strong> Company information, contact information, and technographic data.</li>
<li><strong>Integrations:</strong> CRM and sales-tool integrations.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>Datanyze Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>90-day free trial ✅</td>
</tr>
<tr>
<td>Basic paid</td>
<td>$29/mo</td>
</tr>
<tr>
<td>High-end paid</td>
<td>$55/mo</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Still a reasonable low-volume choice if your actual buying trigger is tech-stack intelligence.</p>
<h3 id="6-people-data-labs">6. People Data Labs</h3>
<p><a href="https://www.peopledatalabs.com/?ref=nubela.co">People Data Labs</a> packages public and partner-sourced data into datasets customers can call using APIs.</p>
<p>One thing to note, People Data Labs isn't as pleasant for fast-moving SMB users as simpler tools are, but the data model is broad. They offer a very large number of fields, sometimes by splitting a single concept into many granular attributes.</p>
<ul>
<li><strong>Data Freshness:</strong> Datasets are updated monthly by default.</li>
<li><strong>Data Points:</strong> 200+ data points per profile, though that count is inflated by granularity.</li>
<li><strong>Integrations:</strong> Integrates with many automation tools and CRMs.</li>
<li><strong>Legal Compliance:</strong> GDPR, CCPA, SOC 2, and ISO 27001.</li>
</ul>
<p><strong>People Data Labs Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Up to 100 records</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$98/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom pricing</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Best if you care about broad schema coverage and API-first consumption more than point-and-click simplicity.</p>
<h3 id="7-lead411">7. Lead411</h3>
<p><a href="https://www.lead411.com/?ref=nubela.co">Lead411</a> is a web-based lead generation tool that helps people discover contact details for decision-makers at major corporations around the world.</p>
<p>What sets Lead411 apart is its verified email angle. You don't just get enriched company data, but also reliable communication channels to reach decision-makers.</p>
<ul>
<li><strong>Data Freshness:</strong> Updated frequently, though not very specifically documented.</li>
<li><strong>Data points:</strong> Database of 450 million global contacts.</li>
<li><strong>Integrations:</strong> Supports 20+ CRM integrations.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>Lead411 Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>7-day free trial ✅</td>
</tr>
<tr>
<td>Basic paid</td>
<td>$99/mo</td>
</tr>
<tr>
<td>High-end paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>A good SMB outbound tool if verified emails matter more than exotic data types.</p>
<h3 id="8-rocketreach">8. RocketReach</h3>
<p><a href="https://rocketreach.co/?ref=nubela.co">RocketReach</a> is a lead intelligence platform for researching names, job positions, and email addresses.</p>
<p>It has features like Chrome extension, advanced search, and bulk lookup. It is widely used for cold email outreach, targeted campaigns, lead nurturing, and recruiting efforts.</p>
<ul>
<li><strong>Data Freshness:</strong> Updates daily.</li>
<li><strong>Data Points:</strong> 20+ exportable data points.</li>
<li><strong>Integrations:</strong> Supports CRM and automation integrations.</li>
<li><strong>Legal Compliance:</strong> CCPA compliant, GDPR stance less clearly marketed.</li>
</ul>
<p><strong>RocketReach Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Trial available</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$70/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$300/mo</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Good for email-led workflows. Less compelling if phone data is your main need.</p>
<h3 id="9-leadiq">9. LeadIQ</h3>
<p><a href="https://leadiq.com/?ref=nubela.co">LeadIQ</a> is a platform that increases the efficiency of sales teams by capturing and sequencing contact information with a single click.</p>
<p>The platform combines prospect data, sales triggers tracking, and personalized cold outreach. Using LeadIQ's Chrome extension, you can capture prospects to a dedicated list while browsing.</p>
<ul>
<li><strong>Data Freshness:</strong> Often close to real-time in browser-led workflows.</li>
<li><strong>Data Points:</strong> 20+ data points across individuals and company profiles.</li>
<li><strong>Integrations:</strong> Supports popular CRM integrations.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>LeadIQ Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free version available ✅</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$45/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Easy to use. Better for SDR workflow convenience than deep data sophistication.</p>
<h3 id="10-clearbit">10. Clearbit</h3>
<p><a href="https://clearbit.com/?ref=nubela.co">Clearbit</a> is now folded into HubSpot's world, but it is still a recognizable B2B data provider for company enrichment and profile building.</p>
<p>Clearbit combines first-party data and third-party sources to enrich company profiles with firmographic and technographic data that automatically updates every 30 days.</p>
<ul>
<li><strong>Data Freshness:</strong> Records update every 30 days.</li>
<li><strong>Data Points:</strong> 100+ data points.</li>
<li><strong>Integrations:</strong> Now effectively HubSpot-centric.</li>
<li><strong>Legal Compliance:</strong> CCPA-compliant and GDPR aligned.</li>
</ul>
<p><strong>Clearbit Pricing</strong></p>
<p>No transparent standalone pricing. Contact HubSpot.</p>
<p><strong>TLDR Verdict</strong></p>
<p>Fine if you're already deep in HubSpot. Annoying if you value pricing transparency.</p>
<h3 id="11-salesintel">11. SalesIntel</h3>
<p><a href="https://salesintel.io/?ref=nubela.co">SalesIntel</a> offers contact data, direct dials, and technographic and firmographic information.</p>
<p>The platform claims 95% accuracy in delivering contact data and emphasizes re-verification.</p>
<ul>
<li><strong>Data Freshness:</strong> Re-verifications every three months.</li>
<li><strong>Data Points:</strong> Firmographic and technographic data plus contact info.</li>
<li><strong>Integrations:</strong> Good CRM and sales-tool coverage.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>SalesIntel Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>14-day free trial</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$69/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Worth a look if direct dials are important and you want something more verification-heavy.</p>
<h3 id="12-uplead">12. UpLead</h3>
<p><a href="https://www.uplead.com/?ref=nubela.co">UpLead</a> is a highly rated B2B lead generation platform designed to help streamline lead generation operations by providing reliable contact data.</p>
<p>Instead of giving you raw scraped datasets, they give you a cleaner prospecting list you can plug into your CRM.</p>
<ul>
<li><strong>Data Freshness:</strong> Monthly updates.</li>
<li><strong>Data Points:</strong> People and company profiles, verified emails, intent data.</li>
<li><strong>Integrations:</strong> Supports major CRMs.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>UpLead Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>7-day free trial available ✅</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$99/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Customizable usage and pricing</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>A tidy option for smaller teams that care about accuracy more than maximum depth.</p>
<h3 id="13-owler">13. Owler</h3>
<p><a href="https://corp.owler.com/?ref=nubela.co">Owler</a> is one of the larger crowdsourced B2B data providers, pulling insights from its active user community.</p>
<p>Owler is different from the norm, and is an ideal choice for market research and company tracking. If you need to understand not just a company but its position in the market, including competitors, estimated revenue, and leadership details, it is still interesting.</p>
<ul>
<li><strong>Data Freshness:</strong> Real-time community updates, 500,000+ profile updates per month.</li>
<li><strong>Data Points:</strong> Funding, M&amp;A, press releases, competitor updates, and more.</li>
<li><strong>Integrations:</strong> CRM integrations available.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>Owler Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free plan available ✅</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$39/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Good for tracking and market context. Not my first choice for direct contact-data-heavy outbound.</p>
<h3 id="14-apolloio">14. Apollo.io</h3>
<p><a href="https://apollo.io/?ref=nubela.co">Apollo.io</a> has one main purpose: boost sales engagement.</p>
<p>Apollo refreshes your systems with contact databases and adds a lot of workflow and sequencing capability on top. This is why people keep buying it even when they complain about the data.</p>
<ul>
<li><strong>Data Freshness:</strong> Frequently updated.</li>
<li><strong>Data Points:</strong> Contact information, buying intent, and more.</li>
<li><strong>Integrations:</strong> Strong CRM coverage.</li>
<li><strong>Legal Compliance:</strong> CCPA compliant.</li>
</ul>
<p><strong>Apollo.io Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free plan available ✅</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$59/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$149/user/mo</td>
</tr>
</tbody>
</table>
<p><strong>Pros:</strong></p>
<ul>
<li>Good automation stack.</li>
<li>65+ advanced search filters.</li>
<li>Usually wins on value for smaller outbound teams.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Data quality can be uneven.</li>
<li>Limited data outside the US.</li>
<li>Full automation can make teams lazy if they are not careful.</li>
</ul>
<p><strong>TLDR Verdict</strong></p>
<p>If your priority is cheap-ish outbound volume, Apollo is hard to ignore.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/erickrealz</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Apollo is your best bet for data quality and price. I work at an outreach company and we use it for most of our clients because it's way cheaper than ZoomInfo with similar accuracy. ZoomInfo has the best data but costs a fortune and their contracts are brutal...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1ncw8bi/anyone_here_used_zoominfo_seamlessai_apollo/ndiay4e/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h3 id="15-coresignal">15. Coresignal</h3>
<p><a href="https://coresignal.com/?ref=nubela.co">Coresignal</a> houses large datasets of public and private data, which they either scraped themselves or acquired through third-party means. They also have live scraping APIs, but these are more limited in scope.</p>
<p>Coresignal aggregates data from 20 different sources and boasts 731+ million employee data records and 102+ million company data records.</p>
<ul>
<li><strong>Data Freshness:</strong> Datasets updated monthly, separate live options via APIs.</li>
<li><strong>Data Points:</strong> Missing some important contact data like phone numbers and emails.</li>
<li><strong>Integrations:</strong> Six APIs for integration.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>Coresignal Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free version available</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$49/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$1,500/mo</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Useful for bulk data workflows. Less compelling if you need complete contact records out of the box.</p>
<h3 id="16-zoominfo">16. ZoomInfo</h3>
<p><a href="https://www.zoominfo.com/?ref=nubela.co">ZoomInfo</a> sells access to its database on a subscription basis. It deals with extensive company and contact information and is equipped with advanced search capabilities and integration options.</p>
<p>ZoomInfo boasts datasets of over 321 million individual contacts and 104 million company profiles and remains one of the most well-known B2B lead enrichment platforms.</p>
<p>One thing to note is their data is pretty US-centric, so if you're looking for wider geographical coverage, ZoomInfo might come up short. It doesn't take away from the fact that they provide a variety of solutions and different packages for data enrichment.</p>
<ul>
<li><strong>Data Freshness:</strong> Updated based on change detection.</li>
<li><strong>Data points:</strong> Company profile, business contacts, intent data, and interaction analysis.</li>
<li><strong>Integrations:</strong> Strong CRM and sales-tool ecosystem.</li>
<li><strong>Legal Compliance:</strong> GDPR, CCPA, and ISO 27001.</li>
</ul>
<p><strong>ZoomInfo Pricing</strong></p>
<p>Their pricing information is not publicly available, although some sources claim plans start around $14,995/year.</p>
<p><strong>Pros:</strong></p>
<ul>
<li>Accurate contact information.</li>
<li>Strong workflow automation.</li>
<li>Good org-chart and enterprise-account depth.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Expensive plans.</li>
<li>Too many packages and add-ons.</li>
<li>Steep learning curve.</li>
</ul>
<p><strong>TLDR Verdict</strong></p>
<p>A serious option if you primarily work with North American data and can tolerate enterprise pricing.</p>
<h3 id="17-data-axle">17. Data Axle</h3>
<p><a href="https://www.data-axle.com/?ref=nubela.co">Data Axle</a> continues to deliver enriched company data, complemented by robust firmographics and advanced segmentation tools.</p>
<p>The data provider's hyper-specific segmentation is a feature that deserves a shout. It allows you to target companies based on criteria like location, revenue, or niche industry.</p>
<ul>
<li><strong>Data Freshness:</strong> Monthly updates.</li>
<li><strong>Data Points:</strong> 400+ attributes from 100+ sources.</li>
<li><strong>Integrations:</strong> Supports numerous integrations.</li>
<li><strong>Legal Compliance:</strong> GDPR and CCPA compliant.</li>
</ul>
<p><strong>Data Axle Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>30-day free trial ✅</td>
</tr>
<tr>
<td>Pay-as-you-go</td>
<td>$17.95 per credit report</td>
</tr>
<tr>
<td>Basic Paid (Monthly)</td>
<td>$195/mo</td>
</tr>
<tr>
<td>Basic Paid (Annual)</td>
<td>$179/mo</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Great for segmentation-heavy workflows and industries that care a lot about precision.</p>
<h3 id="18-hunterio">18. Hunter.io</h3>
<p><a href="https://hunter.io/?ref=nubela.co">Hunter.io</a> makes the list 18 in practice after adding NinjaPear while preserving the original article's structure. I am keeping the original framing and not pretending the math magically stayed perfect.</p>
<p>Hunter.io is a tool to find and verify emails to support email campaigns. It is useful for marketers, recruiters, and sales teams looking to connect with key decision-makers and prospects.</p>
<p>Using Hunter, you can extract email addresses associated with a certain domain, build a targeted contact list, automate outreach messages, and scale campaigns.</p>
<ul>
<li><strong>Data Freshness:</strong> Frequently updated, though not specified very clearly.</li>
<li><strong>Data Points:</strong> Focuses on email-related data points like sender reputation and bounce rates.</li>
<li><strong>Integrations:</strong> Integrates with many popular tools.</li>
<li><strong>Legal Compliance:</strong> GDPR compliant.</li>
</ul>
<p><strong>Hunter.io Pricing</strong></p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free plan available ✅</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$34/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$349/mo</td>
</tr>
</tbody>
</table>
<p><strong>TLDR Verdict</strong></p>
<p>Great if you're looking for B2B data with additional support for your email campaigns, but very much email-first rather than true broad-spectrum B2B intelligence.</p>
<h2 id="what-i-would-actually-choose">What I would actually choose</h2>
<p>This is the part most comparison articles avoid because it forces a real opinion.</p>
<p>If I were choosing today:</p>
<ul>
<li><strong>For competitive intelligence:</strong> NinjaPear</li>
<li><strong>For enterprise contact data in North America:</strong> ZoomInfo</li>
<li><strong>For budget-conscious outbound:</strong> Apollo.io</li>
<li><strong>For simple contact lookup:</strong> Lusha</li>
<li><strong>For technographics:</strong> Datanyze</li>
<li><strong>For email-only workflows:</strong> Hunter.io</li>
<li><strong>For structured bulk data via API:</strong> People Data Labs or Coresignal</li>
</ul>
<p>That is the honest answer. Not one winner. A shortlist by use case.</p>
<h2 id="my-actual-advice">My actual advice</h2>
<p>If you are evaluating B2B data providers, do not buy off a grid like this alone. Pull a sample of 100 accounts from your actual ICP and score each vendor on four things:</p>
<ol>
<li>Match rate</li>
<li>Accuracy rate</li>
<li>Missing-field rate</li>
<li>Workflow friction</li>
</ol>
<p>That last one matters more than people admit. A provider can be 10% better on record quality and still lose because your reps hate using it.</p>
<p>Users keep saying the same thing in public, and they are right:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales_intelligence</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Cute-Individual4472</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Coverage is super uneven and provider “A” vs “B” often flips depending on segment and region...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales_intelligence/comments/1rp8c4b/comparing_contact_coverage_across_lusha_apollo/o9nfpdh/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is why I would not ask, "Who is the best B2B data provider?" I would ask, <strong>best for what exact motion?</strong></p>
<h2 id="final-call">Final call</h2>
<p>B2B data is still one of the few unfair advantages in GTM, but only if the data maps to the motion. If you just need fast contact lookup, start with Lusha or Apollo. If you have enterprise budget and care about North American account depth, ZoomInfo is still in the conversation. If you need customer overlap, competitor mapping, company-change monitoring, and public-web enrichment in one place, NinjaPear is the one I would test first.</p>
<p>If you came here because you were specifically looking for Proxycurl, the update is simple: Proxycurl has been sunset, and the path forward is NinjaPear. It is not a 1:1 clone. That is intentional.</p>
<p>Start with the 3-day trial, run 10 real accounts through it, and see if the signal quality changes how your team prioritizes. That is the only test I trust anymore.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Firmographic Data Meaning in 2026 ]]></title>
        <description><![CDATA[ Firmographics is a set of B2B data points used to form market segments. These data points are indispensable for company success. Learn how and where you can get access to firmographic data. ]]></description>
        <link>https://nubela.co/blog/what-is-firmographics-definition-benefits-database/</link>
        <guid isPermaLink="false">638db76405ceb40001916400</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Wed, 15 Jan 2025 18:06:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_431.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you want to stay ahead in the B2B market, consumer satisfaction should be your top priority. Your customers judge what you offer based on their unique needs, and market segmentation helps you figure out exactly who your customers are and what their needs are.</p>
<p><strong>Firmographics</strong> is one type of data that focuses on B2B (business-to-business) customers. Companies use firmographics and demographics data to create customer profiles, that are eventually used to market their products and services.</p>
<p>While demographics are more focused on building profiles by grouping the population of a certain geographic region under different characteristics, firmographics concerns itself with identifying the right sector of the audience, it does this by dividing potential clients into different groups to work on customer satisfaction.</p>
<p>Let's dive into more details on firmographics.</p>
<blockquote>
<p><strong>2026 update:</strong> Proxycurl API has been sunset. The founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is the current B2B data platform referenced in this article where relevant. I am retaining the historical Proxycurl references below where they help explain the original context.</p>
</blockquote>
<h2 id="what-is-firmographic-data">What is Firmographic data?</h2>
<p>Firmographic data is information about a company's key characteristics that can be used to define market segments and gain insights into the needs and desires of these organizations. It can include information like company size, industry type, company reach, annual revenue and expenses, ownership type, growth trend and much more.</p>
<p>Like other primary forms of segmentation, Firmographic data is collected and then used to analyze B2B audiences based on their characteristics, making it much easier to target, customize, market, and identify high-value customers via the <strong>Firmographic Segmentation</strong> process.</p>
<h2 id="attributes-of-firmographic-segmentation">Attributes of Firmographic segmentation</h2>
<p>Firmographic segmentation examines and categorizes B2B audiences based on common characteristics. While B2B companies can use a plethora of variables for firmographic segmentation, we'll focus on the five most important aspects of firmographic segmentation:</p>
<h3 id="1-industry">1. Industry</h3>
<p>The Industry is divided into 4 broad categories.</p>
<ul>
<li>Primary Industry: Agriculture, Mining, Fishing.</li>
<li>Secondary Industry: Manufacturing, Processing, Construction.</li>
<li>Tertiary Industry: Hotels, Real-estates, Restaurants.</li>
<li>Quaternary Industry: Health Care, Education.</li>
</ul>
<p>This feature is essential for firmographic segmentation. It entails categorizing your target audience based on the type of product/service they offer. Targeting the right industry can help your segmentation efforts, and vice versa. It is beneficial to understand the specific industry in which your product/service is valuable.</p>
<p><img alt="Attributes of Firmographic Segmentation" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2022/12/TLC_All_About_Firmographics_-_Definition-_Benefits-_Database_Main_5_Attributes_of_Firmographic_segmentation--2--1.png" /></p>
<p>Firmographic Segmentation includes: Industry, Location, Size, Status &amp; Structure, Performance, Executive title, Sales Cycle</p>
<h3 id="2-location">2. Location</h3>
<p>This is based on the geographical location of the target audience. It considers factors such as city, country, state, and environment. The location of a company influences how customers buy its products and determines a brand's ability to sell and distribute. This firmographic attribute can be used by B2B marketers to identify areas where their product adds value to consumers.</p>
<h3 id="3-size">3. Size</h3>
<p>This firmographic attribute can be defined using an organization's annual revenue and employee count. It indicates the size of an organization, whether it is micro-scale, small-scale, medium-scale, or large-scale.</p>
<p>In order to target the right audience under the size attribute, you must first ask yourself whether your target market is a Fortune 500 company or a small start-up. You must ensure that your target market can afford what you're offering or risk losing money.</p>
<p>Similarly, an organization's employee size can indicate whether it is a small, local business, or multinational, as well as its purchasing power and likelihood of returning customers.</p>
<h3 id="4-status-and-structure">4. Status and Structure</h3>
<p>This usually refers to an organization's legal status. It could be a sole proprietorship, a partnership/limited partnership, a corporation, a limited liability company (LLC), a non-profit organization, or something else. the funding type and hierarchy differ, hence understanding which organizations would benefit the most from your product/service will inform your marketing strategies and ensure increased profits.</p>
<h3 id="5-performance">5. Performance</h3>
<p>This firmographic segmentation feature encircles an organization's accomplishment over time. It considers factors such as business execution, employment growth, financial performance, and revenue increase or decrease. Grouping your target audience based on their performance over time is an effective way to determine their current position and predict their future behavior, which is useful in developing sales and market strategies.</p>
<p>Furthermore, the <strong>Executive title</strong> and <strong>Sales cycle</strong> of a company are critical variables in firmographic segmentation. Knowing the executive titles of your target audience(s) allows you to identify the key decision-makers and influencers in your target organization. Are you aiming for the CEO, the Managing Director, or the CFO? Knowing which customers can be relied on helps you avoid wasting time and effort on the wrong decision-maker.</p>
<p>Understanding your target audience's sales cycle stage always determines the type of information you provide to them. The stages of the sales cycle are <strong>Awareness</strong>, <strong>consideration</strong>, and <strong>decision</strong>.</p>
<p>Let's take a closer look: In the awareness stage, a company is just learning about what you offer as a B2B company and is most likely looking into other options. Your brand may be considered a viable option during the consideration stage. The decision stage indicates that they have determined that your company meets all of their requirements and will select you over competing options. Knowing your target market's cycle stage allows you to know when to push them to the next cycle stage and aim for the bull's eye.</p>
<h2 id="why-is-firmographic-data-important">Why is Firmographic Data important?</h2>
<p>Firmographic data has aided many B2B organizations in identifying their target segment and ideal customers. A single approach for all types of matrices does not yield positive results. Using a different approach for each grouped segment with the help of firmographics yields the desired result.</p>
<p>Here are the advantages of firmographic data:</p>
<h3 id="1-helps-identify-b2bc2b-target-segment">1. Helps Identify B2B/C2B Target Segment</h3>
<p>Firmographic data is useful for B2B companies in identifying their target audience. B2B companies' target audience consists of decision-makers in the sector they are prospecting, such as CEOs, Managing Directors, CTOs, and CFOs.</p>
<p>Identification of these target segments is critical because they are the main influencers in your prospective organization, purchase authorization, and approval of the services you provide; this can be useful in customizing sales and marketing approaches. Additionally, understanding these segments helps create SEO-optimized content that resonates with them, and a SERP checker can then evaluate how well this content ranks for relevant keywords.</p>
<p><img alt="Key benefits of Firmographic Data" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2022/12/TLC_All_About_Firmographics_-_Definition-_Benefits-_Database_What_are_the_key_benefits_of_Firmographic--2-.png" /></p>
<p>Firmographic Data aids in Defining Target Segments, Enhances Marketing Campaigns, &amp; Ultimately Boosts Return on Investments (ROI)</p>
<h3 id="2-refines-advertising-campaigns-promotional-tactics">2. Refines Advertising Campaigns, Promotional Tactics</h3>
<p>Advertising based on assumptions can be difficult today. If you make incorrect assumptions about a target audience, you may end up wasting resources if they are not interested in your product/service. Instead, by gathering as much information as possible about your target audience, you can then use that information to target ads more effectively.</p>
<p>For example, if you're running ads on LinkedIn, you can target audiences based on the firmographic data we discussed earlier.</p>
<h3 id="3-helps-increase-roi">3. Helps Increase ROI</h3>
<p>Understanding current and prospective customers through firmographics allows you to allocate and use resources in a calculated manner, resulting in the expected results and increased return on investment.</p>
<h2 id="how-do-you-get-firmographic-data">How do you get Firmographic Data?</h2>
<p>Data acquisition, processing, and analytics are extensive processes and for them to be meaningful, up-to-date quality data is crucial. Let's look at some of the ways of data acquisition.</p>
<h3 id="1-3rd-party-websites">1. 3rd Party Websites</h3>
<p>Today, you can obtain ample information on any company with the click of a button, but the accuracy and relevance of such data can be a challenge.</p>
<p>Customer data platforms, marketing intelligence, and a company's public databases are examples of third-party websites that provide firmographic data. For B2B businesses to use for marketing and lead generation, information from these sources is accurate and reliable.</p>
<h3 id="2-conducting-surveys">2. Conducting Surveys</h3>
<p>Online surveys have grown in popularity as a cost-effective way for businesses to collect data on their customers. However, they can be time-consuming. B2B marketers, for example, can create surveys to gather information about a company's size, industry, location, and revenue.</p>
<p>Even if it appears to be a simple way to obtain direct data, there is a chance that your target audience will withhold or even refuse to provide certain information for reasons best known to them.</p>
<h3 id="3-linkedin-search">3. LinkedIn Search</h3>
<p><a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkedIn search</a> is another popular source of firmographic data; most, if not all, businesses have a presence on LinkedIn. It's also a low-cost method of gathering information about your target market.</p>
<h3 id="4-professional-data-provider">4. Professional Data Provider</h3>
<p>The data sources listed above are useful, but getting data from a reputable data provider is the best way to obtain massive, structured, and accurate data on your target market.</p>
<p>Historically, Proxycurl's company profile API provided firmographic data, allowing you to group or filter organizations based on category, how much a company has received in funding, past and current employee data, acquisitions and exits, and much more. Furthermore, it was a one-step process that required less time.</p>
<p>In 2026, <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is one of the B2B data providers you can use for firmographic data. Its Company API includes company details such as industry, founders, headcount, funding, and related company updates, which makes it useful when you need current company profiles instead of stitching together records manually.</p>
<p>Cross-checking with publicly available sources is also advised to ensure consistency of accuracy.</p>
<h2 id="the-bottomline">The Bottomline</h2>
<p>Firmographic attributes should be used by B2B companies to create ideal customer profiles. All of the various matrices provide opportunities and necessitate different approaches. Be as specific as possible.</p>
<blockquote>
<p>Know your customer and comprehend your consumer.</p>
</blockquote>
<p>Using the right amount of resources is critical when targeting prospective organizations. Gathering firmographic data from web searches and surveys can be time-consuming, and you may end up with unnecessary information; instead, it is often better to rely on a professional data provider.</p>
<p>If you came to this article looking for the old Proxycurl route, the short version is this: Proxycurl API has been sunset, and the founder behind it is now working on NinjaPear. If you want a current option, start with NinjaPear's company data platform and work outward from there.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="why-is-firmographic-data-often-overlooked">Why is firmographic data often overlooked?</h4>
<p>If you are a startup or a small business, you might overlook firmographic data due to limited resources or just aren’t aware about its potential. But the data is invaluable to identify and target the right market segments from the early get go.</p>
<p>For established businesses, it helps refine strategies, maintain competitive edges, and expand into new markets.</p>
<h4 id="how-often-should-firmographic-data-be-updated">How often should firmographic data be updated?</h4>
<p>Firmographic data should be updated at least monthly or whenever significant market or company changes occur.</p>
<p>In practice, the right answer depends on how you use it. If you're scoring accounts or routing outbound, stale headcount and outdated funding data can break your targeting faster than most teams realize.</p>
<h4 id="are-there-any-ethical-or-legal-concerns-when-collecting-or-using-firmographic-data">Are there any ethical or legal concerns when collecting or using firmographic data?</h4>
<p>Yes, if you are scraping for data manually, there are certain ethical and legal concerns like transparency in data collection and respecting privacy laws like GDPR and CCPA.</p>
<p>The easiest way to reduce this risk is to lean towards a professional data provider who knows what they’re doing.</p>
<h4 id="how-can-you-integrate-firmographic-data-into-your-crm-system">How can you integrate firmographic data into your CRM system?</h4>
<p>You can integrate firmographic data into a CRM using APIs, data enrichment tools, or by importing data from trusted sources. This helps in segmenting leads, personalizing outreach, and tracking account details.</p>
<h4 id="whats-the-best-way-to-validate-the-accuracy-of-firmographic-data">What’s the best way to validate the accuracy of firmographic data?</h4>
<p>Validate data by cross-referencing multiple reputable sources, conducting spot checks, and using real-time verification tools.</p>
<p>For instance, websites like Crunchbase and LinkedIn are commonly used as reference points on company and individual data. If you're using a provider, you should still spot-check the output against public sources instead of assuming every field is correct by default.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Top 50 High-Growth Companies by Headcount Tracking Software and Post-Money Valuation, 2026 Update ]]></title>
        <description><![CDATA[ Discover the top 50 companies with highest headcount growth and learn how post money valuation and headcount tracking will help make better investment decisions in 2025. ]]></description>
        <link>https://nubela.co/blog/post-funding-growth-data-report/</link>
        <guid isPermaLink="false">672d7a771cb59d0001b1786d</guid>
        <category><![CDATA[ high-growth comapnies ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Tue, 14 Jan 2025 10:53:15 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_430.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you are looking for <strong>headcount tracking software</strong> to spot growth before the rest of the market does, this is the practical play: track hiring and headcount changes next to funding and valuation, not in isolation. I still like headcount as a signal because teams can fake a lot of things, but payroll is harder to fake for long.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/human_resources</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Technical-Apple-2492</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">From what I’ve seen, HR software isn’t about the number of employees; it’s about when complexity starts costing time and clarity. Spreadsheets and emails work early on, but once documents, approvals, and compliance start piling up, HR teams spend more time managing chaos than people.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/human_resources/comments/1q6yig9/is_it_worth_investing_in_hr_software_early_or/nye1anh/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That quote is about internal HR ops, but the same logic applies to investors and GTM teams. Once you are tracking more than a handful of companies, spreadsheets stop being analysis and start becoming clerical work.</p>
<blockquote>
<p><strong>2026 callout:</strong> Proxycurl has been sunset. I’m keeping the useful historical parts of this article intact because the workflow still matters, but the founder behind Proxycurl is now building NinjaPear. If you want the modern replacement for headcount tracking software workflows, use <a href="https://nubela.co/company-api?ref=nubela.co">NinjaPear Company API</a>, specifically the Employee Count endpoint at <code>/api/v1/company/employee-count</code>.</p>
</blockquote>
<h2 id="global-investment-scenario-in-2024">Global Investment Scenario in 2024</h2>
<p>2024 saw a sharp decline in global investments compared to 2023. A sign of a cautious, less confident approach from investors. By the third quarter, the number of funding rounds decreased by 25% compared to the same period in 2023.</p>
<p><a href="https://www.vestd.com/blog/the-global-investment-report-2024?ref=nubela.co">The first quarter</a> was promising with 13,029 funding rounds, the highest of the year. Venture funding in particular reached $66.5 billion by the third quarter. That's no feat, because it's down by 15% compared to the numbers in 2023.</p>
<p><a href="https://news.crunchbase.com/venture/billion-dollar-funding-rounds-ai-recap-november-2024/?ref=nubela.co#:~:text=Global%20venture%20funding%20totaled%20%2428,billion%20raised%20in%20November%202023">Crunchbase</a> reports start-up funding went down by a whopping 63% from what it was in 2023, while early-stage funding fell over 20% year over year. However, late-stage funding doubled year over year.</p>
<p>AI startups operating across multiple sectors saw a huge push, as it reached a monthly peak of $14 billion in November of 2024.</p>
<p>The U.S. in particular also faced their fair share of challenges, with declining funding round rates experiencing a drop of 28% from what it was last year. More than 3,000 tech companies went out of business despite being backed by private ventures.</p>
<h2 id="the-2025-outlook">The 2025 Outlook</h2>
<p><a href="https://russellinvestments.com/ca/global-market-outlook?ref=nubela.co#ColorBoxesRoot_65071822-8f82-4dd6-9f72-4ecd6a2a7287">Experts</a> predict a continuation of the downward trend outside of the US. The European Central Bank is likely to cut the deposit rate to 1.5% by the end of the year to lighten the tariff weight.</p>
<p>For the US, things look better. Capital markets are predicted to elevate as Trump's administration takes over. The US economy is expected to grow steadily at 2%, even if things outside the US look down.</p>
<p>As an investor, you might be distraught with what 2024 brought in, going into 2025. It just stresses the need for decisive, actionable data.</p>
<h2 id="the-2026-outlook">The 2026 Outlook</h2>
<p>2026 looks better than 2024 did, but not in the clean, broad-based way people love to pretend on LinkedIn. The recovery is uneven. That matters because <strong>headcount tracking software</strong> is most useful in uneven markets, when the winners separate early and the laggards get very good at storytelling.</p>
<p>Wellington’s 2026 venture outlook says liquidity is finally returning after two years of capital scarcity, with IPO volumes up 20% and proceeds up 84% over the prior 12 months. It also points to global M&amp;A volume up 40% year over year in 2025, and a secondaries market projected to exceed $210 billion. Their summary is the right one: capital is returning, but success depends on selectivity, access, and underwriting discipline.</p>
<p>That lines up with what I would watch operationally:</p>
<ul>
<li><strong>Fresh employee count</strong>, because a company that is still hiring into product, sales, or customer success in a selective market is telling you something real.</li>
<li><strong>Funding history</strong>, because a hiring spike right after a round means something different from a hiring spike 18 months into a dry spell.</li>
<li><strong>Company updates</strong>, because headcount without context can fool you.</li>
</ul>
<p>This is also why I like NinjaPear’s workflow better for 2026. The first object is the company website, not a LinkedIn URL. That is a much saner canonical key if you are building durable internal tools.</p>
<h2 id="how-post-money-valuation-and-headcount-tracking-software-help-evaluate-investment-opportunities">How Post Money Valuation and Headcount tracking software help evaluate investment opportunities</h2>
<p><strong>Post money valuation</strong> gives you tangible insights into how a company utilizes its capital to scale its operations. Consistent growth trends post-funding indicate that the company is able to use its new resources to generate returns and build sustainable momentum.</p>
<p>Pre-money valuations are considered to determine the amount of equity investors need to secure in exchange for any capital injection.</p>
<p>For instance, let's assume a company has a $10 million pre-money valuation. If you put $5 million into the company, it creates a post-money valuation of $15 million. So in a very basic scenario, the investor would then have a 33.33% interest in the company, since $5 million is equal to one-third of the post-money valuation of $15 million. This is assuming the investors and the entrepreneurs agree on the valuations without negotiations. Negotiations on the company's assets and intellectual property determine the actual value.</p>
<p><strong>Headcount tracking software</strong> is how you operationalize the signal instead of talking about it abstractly. It helps you analyze the number of employees in an organization over time, spot hiring surges, and pinpoint periods of low growth or contraction. A positive headcount trend, particularly in strategic roles like sales, marketing, and product development, reflects a proactive approach to scaling.</p>
<p>Together, these metrics give investors a clearer picture of a company's trajectory and its potential to deliver significant returns.</p>
<p>Now, I am confident you are a competent investor who knows how to do research before investing. But try to do all of that manually, and you are signing up for clerical hell.</p>
<p>Let's take a look at the top 50 high-growth companies by headcount tracking software and post-money valuation in 2024 that I originally pulled in mere minutes using Proxycurl. I'll keep that historical data below because it is still useful. But if I were doing this today in 2026, I would use <a href="https://nubela.co/company-api?ref=nubela.co">NinjaPear Company API</a> and its <code>Employee Count</code> endpoint, which returns fresh headcount via real-time web search for <strong>2 credits per call</strong>.</p>
<h2 id="top-50-high-growth-companies-by-headcount-tracking-software-and-post-money-valuation">Top 50 high-growth companies by headcount tracking software and post-money valuation</h2>
<table>
<thead>
<tr>
<th>Rank</th>
<th>Company</th>
<th>2022 Headcount</th>
<th>2024 Headcount</th>
<th>Total Funding</th>
<th>Post-Money Valuation</th>
<th>Estimated Revenue</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="https://www.personio.com/?ref=nubela.co">Personio</a></td>
<td>1202</td>
<td>1890</td>
<td>$724.3M</td>
<td>$8.5B</td>
<td>$210.1M</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://www.mews.com/en?ref=nubela.co">Mews</a></td>
<td>359</td>
<td>1046</td>
<td>$442.3M</td>
<td>$1.2B</td>
<td>$234.6M</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://www.apollo.io/?ref=nubela.co">Apollo</a></td>
<td>190</td>
<td>610</td>
<td>$251.3M</td>
<td>$1.6B</td>
<td>$100M</td>
</tr>
<tr>
<td>4</td>
<td><a href="https://www.vanta.com/?ref=nubela.co">Vanta</a></td>
<td>221</td>
<td>566</td>
<td>$353M</td>
<td>$2.45B</td>
<td>$105M</td>
</tr>
<tr>
<td>5</td>
<td><a href="https://drata.com/?ref=nubela.co">Drata</a></td>
<td>180</td>
<td>522</td>
<td>$328.2M</td>
<td>$2B</td>
<td>$63M</td>
</tr>
<tr>
<td>6</td>
<td><a href="https://www.pigment.com/?ref=nubela.co">Pigment</a></td>
<td>102</td>
<td>402</td>
<td>$396M</td>
<td>$1B</td>
<td>$79.8M</td>
</tr>
<tr>
<td>7</td>
<td><a href="https://www.usemultiplier.com/?ref=nubela.co">Multiplier</a></td>
<td>89</td>
<td>369</td>
<td>$77.2M</td>
<td>$400M</td>
<td>$21M</td>
</tr>
<tr>
<td>8</td>
<td><a href="https://factorialhr.com/?ref=nubela.co">FactorialHR</a></td>
<td>445</td>
<td>708</td>
<td>$300M</td>
<td>$1B</td>
<td>$200M</td>
</tr>
<tr>
<td>9</td>
<td><a href="https://ziphq.com/?ref=nubela.co">ZipHQ</a></td>
<td>73</td>
<td>306</td>
<td>$333M</td>
<td>$2.2B</td>
<td>$63M</td>
</tr>
<tr>
<td>10</td>
<td><a href="https://www.dataiku.com/?ref=nubela.co">Dataiku</a></td>
<td>992</td>
<td>1188</td>
<td>$846M</td>
<td>$3.70B</td>
<td>$280M</td>
</tr>
<tr>
<td>11</td>
<td><a href="https://retool.com/?ref=nubela.co">Retool</a></td>
<td>172</td>
<td>337</td>
<td>$135M</td>
<td>$3.2B</td>
<td>$65M</td>
</tr>
<tr>
<td>12</td>
<td><a href="https://www.leadsquared.com/?ref=nubela.co">Leadsquared</a></td>
<td>992</td>
<td>1148</td>
<td>$188M</td>
<td>$1B</td>
<td>$252M</td>
</tr>
<tr>
<td>13</td>
<td><a href="https://wasabi.com/?ref=nubela.co">Wasabi</a></td>
<td>177</td>
<td>322</td>
<td>$358M</td>
<td>$1.1B</td>
<td>$21M</td>
</tr>
<tr>
<td>14</td>
<td><a href="https://clevertap.com/?ref=nubela.co">CleverTap</a></td>
<td>429</td>
<td>542</td>
<td>$175M</td>
<td>$775M</td>
<td>$126M</td>
</tr>
<tr>
<td>15</td>
<td><a href="https://amenitiz.com/en/?ref=nubela.co">Amenitiz</a></td>
<td>147</td>
<td>253</td>
<td>$38.6M</td>
<td>$100M</td>
<td>$21M</td>
</tr>
<tr>
<td>16</td>
<td><a href="https://www.owner.com/?ref=nubela.co">Owner</a></td>
<td>57</td>
<td>162</td>
<td>$15M</td>
<td>$150M</td>
<td>$10M</td>
</tr>
<tr>
<td>17</td>
<td><a href="https://appomni.com/?ref=nubela.co">AppOmni</a></td>
<td>108</td>
<td>205</td>
<td>$123M</td>
<td>$270M</td>
<td>$29M</td>
</tr>
<tr>
<td>18</td>
<td><a href="https://www.deepki.com/?ref=nubela.co">Deepki</a></td>
<td>133</td>
<td>229</td>
<td>$172M</td>
<td>$150M</td>
<td>$22M</td>
</tr>
<tr>
<td>19</td>
<td><a href="https://metronome.com/?ref=nubela.co">Metronome</a></td>
<td>23</td>
<td>115</td>
<td>$78M</td>
<td>$200M</td>
<td>$14.7M</td>
</tr>
<tr>
<td>20</td>
<td><a href="https://www.getflip.com/?ref=nubela.co">Flip</a></td>
<td>90</td>
<td>179</td>
<td>&lt;$5M</td>
<td>$500M</td>
<td>$34M</td>
</tr>
<tr>
<td>21</td>
<td><a href="https://www.montecarlodata.com/?ref=nubela.co">Monte Carlo Data</a></td>
<td>98</td>
<td>186</td>
<td>$236M</td>
<td>$1.6B</td>
<td>$43M</td>
</tr>
<tr>
<td>22</td>
<td><a href="https://www.gwi.com/?ref=nubela.co">GWI</a></td>
<td>358</td>
<td>443</td>
<td>$40M</td>
<td>$850M</td>
<td>$229M</td>
</tr>
<tr>
<td>23</td>
<td><a href="https://www.spendflo.com/?ref=nubela.co">Spendflo</a></td>
<td>15</td>
<td>90</td>
<td>$15.4M</td>
<td>$80M</td>
<td>$17.9M</td>
</tr>
<tr>
<td>24</td>
<td><a href="https://zesty.co/?ref=nubela.co">Zesty</a></td>
<td>97</td>
<td>175</td>
<td>$116.6M</td>
<td>$75M</td>
<td>$20.2M</td>
</tr>
<tr>
<td>25</td>
<td><a href="https://aisera.com/?ref=nubela.co">Aisera</a></td>
<td>171</td>
<td>249</td>
<td>$164M</td>
<td>$1.2B</td>
<td>$42M</td>
</tr>
<tr>
<td>26</td>
<td><a href="https://www.paddle.com/?ref=nubela.co">Paddle</a></td>
<td>245</td>
<td>317</td>
<td>$283.7M</td>
<td>$1.4B</td>
<td>$67.2M</td>
</tr>
<tr>
<td>27</td>
<td><a href="https://optibus.com/?ref=nubela.co">Optibus</a></td>
<td>263</td>
<td>333</td>
<td>$259M</td>
<td>$1.3B</td>
<td>$63M</td>
</tr>
<tr>
<td>28</td>
<td><a href="https://www.merge.dev/?ref=nubela.co">Merge</a></td>
<td>36</td>
<td>104</td>
<td>$74.5M</td>
<td>$225M</td>
<td>$25.6M</td>
</tr>
<tr>
<td>29</td>
<td><a href="https://www.lumos.com/?ref=nubela.co">Lumos</a></td>
<td>29</td>
<td>97</td>
<td>$65M</td>
<td>$100M</td>
<td>$13.7M</td>
</tr>
<tr>
<td>30</td>
<td><a href="https://www.descript.com/?ref=nubela.co">Descript</a></td>
<td>77</td>
<td>142</td>
<td>$95M</td>
<td>$550M</td>
<td>$21M</td>
</tr>
<tr>
<td>31</td>
<td><a href="https://www.instadeep.com/?ref=nubela.co">InstaDeep</a></td>
<td>146</td>
<td>211</td>
<td>$107M</td>
<td>$400M</td>
<td>$31.5M</td>
</tr>
<tr>
<td>32</td>
<td><a href="https://www.airwallex.com/?ref=nubela.co">Airwallex</a></td>
<td>646</td>
<td>735</td>
<td>$702M</td>
<td>$6.0B</td>
<td>$252.1M</td>
</tr>
<tr>
<td>33</td>
<td><a href="https://www.sardine.ai/?ref=nubela.co">Sardine</a></td>
<td>42</td>
<td>103</td>
<td>$75.6M</td>
<td>$170M</td>
<td>$18.7M</td>
</tr>
<tr>
<td>34</td>
<td><a href="https://www.wetravel.com/?ref=nubela.co">WeTravel</a></td>
<td>62</td>
<td>126</td>
<td>$27M</td>
<td>$130M</td>
<td>$17.5M</td>
</tr>
<tr>
<td>35</td>
<td><a href="https://www.hebbia.ai/?ref=nubela.co">Hebbia</a></td>
<td>12</td>
<td>67</td>
<td>$160M</td>
<td>$710M</td>
<td>$9.5M</td>
</tr>
<tr>
<td>36</td>
<td><a href="https://www.assembled.com/?ref=nubela.co">Assembled</a></td>
<td>49</td>
<td>103</td>
<td>$70.7M</td>
<td>$130M</td>
<td>$13.2M</td>
</tr>
<tr>
<td>37</td>
<td><a href="https://www.birdie.care/?ref=nubela.co">Birdie</a></td>
<td>102</td>
<td>150</td>
<td>$49.4M</td>
<td>$125M</td>
<td>$21M</td>
</tr>
<tr>
<td>38</td>
<td><a href="https://zenskar.com/?ref=nubela.co">Zenskar</a></td>
<td>0</td>
<td>48</td>
<td>$6.5M</td>
<td>&lt;$5M</td>
<td>&lt;$5M</td>
</tr>
<tr>
<td>39</td>
<td><a href="https://www.thanksben.com/?ref=nubela.co">Thanks Ben</a></td>
<td>29</td>
<td>76</td>
<td>$18.5M</td>
<td>&lt;$5M</td>
<td>&lt;$5M</td>
</tr>
<tr>
<td>40</td>
<td><a href="https://www.wati.io/?ref=nubela.co">Wati</a></td>
<td>26</td>
<td>70</td>
<td>$88M</td>
<td>$200M</td>
<td>$31.5M</td>
</tr>
<tr>
<td>41</td>
<td><a href="https://www.joinblvd.com/?ref=nubela.co">Boulevard</a></td>
<td>203</td>
<td>250</td>
<td>$108M</td>
<td>$400M</td>
<td>$36.3M</td>
</tr>
<tr>
<td>42</td>
<td><a href="https://www.mangomint.com/?ref=nubela.co">Mangomint</a></td>
<td>18</td>
<td>64</td>
<td>$48M</td>
<td>$100M</td>
<td>&lt;$5M</td>
</tr>
<tr>
<td>43</td>
<td><a href="https://www.remofirst.com/?ref=nubela.co">Remofirst</a></td>
<td>7</td>
<td>50</td>
<td>$39.1M</td>
<td>$40M</td>
<td>$22.3M</td>
</tr>
<tr>
<td>44</td>
<td><a href="https://www.ardoq.com/?ref=nubela.co">Ardoq</a></td>
<td>147</td>
<td>188</td>
<td>$161.4M</td>
<td>$125M</td>
<td>&lt;$5M</td>
</tr>
<tr>
<td>45</td>
<td><a href="https://onesignal.com/?ref=nubela.co">OneSignal</a></td>
<td>116</td>
<td>155</td>
<td>$84.3M</td>
<td>$500M</td>
<td>$29.4M</td>
</tr>
<tr>
<td>46</td>
<td><a href="https://seamlesshr.com/?ref=nubela.co">SeamlessHR</a></td>
<td>94</td>
<td>136</td>
<td>$10M</td>
<td>$60M</td>
<td>$27.3M</td>
</tr>
<tr>
<td>47</td>
<td><a href="https://meshpayments.com/?ref=nubela.co">Mesh</a></td>
<td>98</td>
<td>135</td>
<td>$123M</td>
<td>$70M</td>
<td>$24.8M</td>
</tr>
<tr>
<td>48</td>
<td><a href="https://www.nilus.com/?ref=nubela.co">Nilus</a></td>
<td>0</td>
<td>39</td>
<td>$8.6M</td>
<td>$25M</td>
<td>&lt;$5M</td>
</tr>
<tr>
<td>49</td>
<td><a href="https://zilliz.com/?ref=nubela.co">Zilliz</a></td>
<td>39</td>
<td>77</td>
<td>$123M</td>
<td>$1B</td>
<td>$21M</td>
</tr>
<tr>
<td>50</td>
<td><a href="https://www.joinarc.com/?ref=nubela.co">Arc</a></td>
<td>16</td>
<td>49</td>
<td>$20M</td>
<td>$500M</td>
<td>$6.3M</td>
</tr>
</tbody>
</table>
<h2 id="what-this-table-still-gets-right">What this table still gets right</h2>
<p>I am not rewriting the historical ranking because the point of it still holds: <strong>headcount growth plus funding context is one of the fastest ways to cut through founder narrative</strong>.</p>
<p>What I would add in 2026 is a simple rule set:</p>
<ol>
<li>Ignore raw hiring growth with no funding context.</li>
<li>Ignore funding with flat or shrinking team size unless margins clearly improved.</li>
<li>Check whether hiring is concentrated in engineering, sales, or support.</li>
<li>Re-check monthly, not yearly, because annual snapshots hide a lot of mess.</li>
</ol>
<p>Users have been saying the same thing about timing signals for years:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">MOST PEOPLE DON’T HAVE A LEAD PROBLEM.

They have a finding the right people at the right time problem.

This fixes that.

Paste your website.
and it literally goes out and:

&gt; Finds companies already looking for what you sell
&gt; Tracks hiring signals, competitors, intent
&gt; Writes personalized outreach for you...</p>&mdash; Aman (@Amank1412) <a href="https://x.com/Amank1412/status/2054203349252403411?ref=nubela.co">Tue May 12 14:13:38 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That tweet is outbound-flavored, but again, same core signal. Right people. Right company. Right time.</p>
<h2 id="1-personio">1. Personio</h2>
<p>Based in Munich, Germany, Personio is an all-in-one HR software platform designed for small and medium-sized businesses. It offers solutions for recruiting, payroll, employee management, and more.</p>
<p>Personio secured a total funding of $724 million over 7 rounds. They subsequently added 688 new employees from 2022 to 2024, the largest headcount growth in the period.</p>
<p>Top employee location percentages:</p>
<ul>
<li>Germany 59.5% at 1104</li>
<li>Ireland 13.4% at 248</li>
<li>Spain 9.7% at 180</li>
</ul>
<p><img alt="Personio pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-9.png" /></p>
<p>Personio Geographical Employee Composition</p>
<p>Here's what the workforce distribution by role looks like:</p>
<ul>
<li>Sales 31.2% at 577</li>
<li>Developers 22% with 408</li>
<li>Operations 21.1% with 391</li>
</ul>
<p><img alt="Personio pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2025/01/image.png" /></p>
<p>Personio Workforce Distribution by Role</p>
<h2 id="2-mews">2. Mews</h2>
<p>Mews is a hospitality management software company that automates operations for hotels and hostels. Their cloud-based system handles reservations, check-ins, payments, and guest management.</p>
<p>This company secured a total funding of $442.3 million in over 8 funding rounds. They added 687 new employees from 2022 to 2024.</p>
<p>Top employee location percentages:</p>
<ul>
<li>Czech Republic 24.3% at 252</li>
<li>United Kingdom 19.5% at 202</li>
<li>Spain 12.7% at 132</li>
</ul>
<p><img alt="Mews pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-11.png" /></p>
<p>Mews Geographical Employee Composition</p>
<p>Here's what the workforce distribution by role looks like at Mews:</p>
<ul>
<li>Operations 29.9% at 310</li>
<li>Developers 28.9% at 299</li>
<li>Sales 13% at 135</li>
</ul>
<p>One interesting find was the position of "Canine Executive Officer" at Mews.</p>
<p><img alt="Mews pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-12.png" /></p>
<p>Mews Workforce Distribution by Role</p>
<h2 id="3-apolloio">3. Apollo.io</h2>
<p>Apollo.io is a sales engagement platform that helps businesses streamline their sales processes by offering prospecting tools, analytics, and automation.</p>
<p>Over 6 rounds of funding, Apollo.io raised $251.3 million. Their new funds allowed them to add 420 new employees from 2022 to 2024.</p>
<p>Top employee location percentage:</p>
<ul>
<li>United States 52.3% at 304</li>
<li>India 19.8% at 115</li>
<li>Colombia 5.2% at 30</li>
</ul>
<p><img alt="Apollo pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-15.png" /></p>
<p>Apollo Geographical Employee Composition</p>
<p>Workforce distribution by role at Apollo:</p>
<ul>
<li>Developer 31.8% at 184</li>
<li>Sales 22.3% at 129</li>
<li>Operations 16.1% at 93</li>
</ul>
<p><img alt="Apollo pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-14.png" /></p>
<p>Apollo Workforce Distribution by Role</p>
<h2 id="4-vanta">4. Vanta</h2>
<p>Based in California, Vanta specializes in automating security and compliance processes, making it easier for businesses to obtain certifications like SOC 2, ISO 27001, and GDPR.</p>
<p>Vanta secured $353 million of total funding over 6 funding rounds. This allowed them to recruit 345 new employees from 2022 to 2024.</p>
<p>Top employee location percentages:</p>
<ul>
<li>United States at 83.8% with 451</li>
<li>Ireland 7.6% at 41</li>
<li>Australia 3.2% at 17</li>
</ul>
<p><img alt="Vanta pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-16.png" /></p>
<p>Vanta Geographical Employee Composition</p>
<p>Here's what Vanta's workforce distribution looks like:</p>
<ul>
<li>Sales 30.1% at 161</li>
<li>Developers 27.5% at 147</li>
<li>Operations 17.6% at 94</li>
</ul>
<p><img alt="Vanta pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-17.png" /></p>
<p>Vanta Workforce Distribution by Role</p>
<h2 id="5-drata">5. Drata</h2>
<p>Similar to Vanta, Drata is a continuous security and compliance automation platform that helps companies achieve and maintain regulatory standards such as SOC 2, GDPR, and ISO 27001.</p>
<p>With over 4 funding rounds, Drata raised over $328.2 million. From 2022 to 2024, they were able to add 342 new employees.</p>
<p>Top employee location percentages:</p>
<ul>
<li>United States 78.6% at 392</li>
<li>Mexico 10% at 50</li>
<li>United Kingdom 4.6% at 23</li>
</ul>
<p><img alt="Drata pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-18.png" /></p>
<p>Drata Geographical Employee Composition</p>
<p>Workforce distribution by role at Drata:</p>
<ul>
<li>Developer 30.8% at 153</li>
<li>Sales 24.2% at 120</li>
<li>Operations 20.4% at 101</li>
</ul>
<p><img alt="Drata pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-19.png" /></p>
<p>Drata Workforce Distribution by Role</p>
<h2 id="6-pigment">6. Pigment</h2>
<p>A business planning and forecasting platform, Pigment helps organizations analyze data, model scenarios, and make informed decisions.</p>
<p>Pigment raised $396 million in total, over 6 funding rounds, financing 300 new employees from 2022 to 2024.</p>
<p>Top employee location percentages:</p>
<ul>
<li>France 44.8% at 173</li>
<li>United States 25.1% at 97</li>
<li>United Kingdom 18.4% at 71</li>
</ul>
<p><img alt="Pigment pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-20.png" /></p>
<p>Pigment Geographical Employee Composition</p>
<p>Here's what the workforce distribution looks like at Pigment:</p>
<ul>
<li>Sales 25.5% at 97</li>
<li>Developers 22% at 84</li>
<li>Operations 18.6% at 71</li>
</ul>
<p><img alt="Pigment pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-21.png" /></p>
<p>Pigment Workforce Distribution by Role</p>
<h2 id="7-multiplier">7. Multiplier</h2>
<p>Multiplier offers global employment solutions, allowing businesses to hire and manage international teams with ease. The platform handles payroll, compliance, and employee benefits across multiple countries.</p>
<p>Multiplier secured a total funding of $77.2 million in over 4 funding rounds. From 2022 to 2024, they added 280 new employees.</p>
<p>Top employee location percentages:</p>
<ul>
<li>India 53.1% at 189</li>
<li>United States 11% at 39</li>
<li>Singapore 7.6% at 27</li>
</ul>
<p><img alt="Multiplier pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-22.png" /></p>
<p>Multiplier Geographical Employee Composition</p>
<p>Workforce distribution by role at Multiplier:</p>
<ul>
<li>Operations 29.5% at 103</li>
<li>Developers 18.6% at 65</li>
<li>Sales 17.2% at 60</li>
</ul>
<p><img alt="Multiplier pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-23.png" /></p>
<p>Multiplier Workforce Distribution by Role</p>
<h2 id="8-factorial">8. Factorial</h2>
<p>Factorial is an HR management platform catering to small and medium-sized businesses. It simplifies HR tasks such as time tracking, performance reviews, and payroll.</p>
<p>In over 6 funding rounds, Factorial secured $299.9 million, most recently in April of 2024 for $76.8M. They subsequently added 263 new employees from 2022 to 2024.</p>
<p>Top employee location percentages:</p>
<ul>
<li>Spain 77.1% at 541</li>
<li>Brazil 5.4% at 38</li>
<li>Mexico 5.3% at 37</li>
</ul>
<p><img alt="Factorial pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-26.png" /></p>
<p>Factorial Geographical Employee Composition</p>
<p>Workforce distribution by role at Factorial:</p>
<ul>
<li>Sales 42.8% at 298</li>
<li>HR 19.3% at 134</li>
<li>Marketing 11.8% at 82</li>
</ul>
<p><img alt="Factorial pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-27.png" /></p>
<p>Factorial Workforce Distribution by Role</p>
<h2 id="9-ziphq">9. ZipHQ</h2>
<p>ZipHQ is a procurement management software company. By automating workflows, managing vendor relationships, and improving spend visibility, ZipHQ helps organizations save time and reduce costs.</p>
<p>With over 6 funding rounds, ZipHQ secured a total funding amount of $371.3 million. The company added 233 new employees from 2022 to 2024.</p>
<p>Top employee location percentages:</p>
<ul>
<li>United States 83.2% at 247</li>
<li>Canada 12.8% at 38</li>
<li>United Kingdom 2.69% at 8</li>
</ul>
<p>Have to give props to ZipHQ for having an employee in Antarctica. Must be a brag.</p>
<p><img alt="ZipHQ pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-28.png" /></p>
<p>ZipHQ Geographical Employee Composition</p>
<p>Here's what ZipHQ's workforce breakdown looks like:</p>
<ul>
<li>Developers 37.6% at 111</li>
<li>Sales 25.1% at 74</li>
<li>Operations 12.5% at 37</li>
</ul>
<p><img alt="ZipHQ pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-29.png" /></p>
<p>ZipHQ Workforce Distribution by Role</p>
<h2 id="10-dataiku">10. Dataiku</h2>
<p>Dataiku is a data science and machine learning platform that enables businesses to analyze large datasets, build predictive models, and operationalize AI solutions.</p>
<p>Dataiku secured a total funding of $846.8 million, over 11 funding rounds. From 2022 to 2024, they added over 196 new employees.</p>
<p>Top employee location percentages:</p>
<ul>
<li>United States 36.9% at 427</li>
<li>France 31.5% at 364</li>
<li>United Kingdom 10% at 116</li>
</ul>
<p><img alt="Dataiku pie-chart detailing geographical employee composition" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-30.png" /></p>
<p>Dataiku Geographical Employee Composition</p>
<p>Workforce breakdown by role in Dataiku:</p>
<ul>
<li>Developers 27.6% at 314</li>
<li>Sales 26.8% at 305</li>
<li>Operations 19.7% at 224</li>
</ul>
<p><img alt="Dataiku pie-chart detailing workforce distribution" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-31.png" /></p>
<p>Dataiku Workforce Distribution by Role</p>
<h2 id="best-headcount-tracking-software-options">Best headcount tracking software options</h2>
<p>This article started as an investor analysis piece, not a software roundup. But the keyword here is <strong>headcount tracking software</strong>, so let me make the practical layer explicit.</p>
<p>If you are comparing 3+ options, you need a table. So here you go.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th style="text-align: right;">Data freshness</th>
<th style="text-align: right;">Pricing clarity</th>
<th style="text-align: right;">API</th>
<th style="text-align: right;">Ease of use</th>
<th style="text-align: right;">Average</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear Employee Count</td>
<td>Fresh company headcount via API</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">4.75/5</td>
</tr>
<tr>
<td>LinkedIn manually</td>
<td>Spot checks</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐☆☆☆☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">2.50/5</td>
</tr>
<tr>
<td>Crunchbase manually</td>
<td>Funding context</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐☆☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐☆</td>
<td style="text-align: right;">2.75/5</td>
</tr>
<tr>
<td>Spreadsheet only</td>
<td>Very small watchlists</td>
<td style="text-align: right;">⭐☆☆☆☆</td>
<td style="text-align: right;">⭐⭐⭐⭐⭐</td>
<td style="text-align: right;">⭐☆☆☆☆</td>
<td style="text-align: right;">⭐⭐☆☆☆</td>
<td style="text-align: right;">2.00/5</td>
</tr>
</tbody>
</table>
<p>My opinionated take:</p>
<ul>
<li><strong>NinjaPear</strong> is the best fit if you want an actual repeatable workflow. Fresh count, API access, website-first identity model.</li>
<li><strong>LinkedIn</strong> is still useful for spot checks, but I would never build a durable internal process around it.</li>
<li><strong>Crunchbase</strong> helps with the funding side, not the headcount side.</li>
<li><strong>Spreadsheets</strong> are fine until you cross from 5 companies into 50. Then they become self-harm.</li>
</ul>
<p>This frustration shows up in public too:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/human_resources</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Abject_Address_3292</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">spreadsheets and emails work in the beginning and you feel like it’s all under control. then slowly leaves are in whatsapp, docs in drive, some info in sheets and you’re just trying to remember who approved what.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/human_resources/comments/1q6yig9/is_it_worth_investing_in_hr_software_early_or/nybgda0/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Different domain, same disease.</p>
<h2 id="how-to-source-data-for-post-money-valuation-and-headcount-tracking-software">How to source data for post money valuation and headcount tracking software</h2>
<p>You can manually search for each company and click through hundreds of job portals, company pages, and industry publications, hoping you'll find everything you need.</p>
<p>Or you can use software that was built for this.</p>
<p>Historically, the source of the original dataset in this article was Proxycurl. That matters because I do not want to pretend it never existed. But Proxycurl is now shut down, and the founder behind it moved on to NinjaPear after the LinkedIn lawsuit in 2025. So if you are reading this in 2026, do not build new workflows on old Proxycurl docs.</p>
<p>Use NinjaPear instead.</p>
<p>With <a href="https://nubela.co/company-api?ref=nubela.co">NinjaPear Company API</a>, I would now pull:</p>
<ul>
<li><code>Company Details</code> for core company data</li>
<li><code>Employee Count</code> for fresh headcount</li>
<li><code>Company Funding</code> for funding rounds and totals</li>
<li><code>Company Updates</code> for timing context</li>
</ul>
<p>A sample <code>Employee Count</code> API call now looks like this:</p>
<pre><code class="language-python">import requests

api_key = 'YOUR_API_KEY'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/api/v1/company/employee-count'
params = {'website': 'https://stripe.com'}

response = requests.get(api_endpoint, params=params, headers=headers)
print(response.json())
</code></pre>
<p>Example response:</p>
<pre><code class="language-json">{
  &quot;employee_count&quot;: 8000
}
</code></pre>
<p>And if you want broader company context:</p>
<pre><code class="language-python">import requests

api_key = 'YOUR_API_KEY'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/api/v1/company/details'
params = {'website': 'https://stripe.com'}

response = requests.get(api_endpoint, params=params, headers=headers)
print(response.json())
</code></pre>
<p>Example response excerpt:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Stripe&quot;,
  &quot;founded_year&quot;: 2010,
  &quot;employee_count&quot;: 8500,
  &quot;industry&quot;: 40201020,
  &quot;executives&quot;: [
    {&quot;name&quot;: &quot;Patrick Collison&quot;, &quot;title&quot;: &quot;Co-founder and CEO&quot;}
  ]
}
</code></pre>
<p>That website-first model is the key difference. When I was running FluxoMetric, I burned ~$4K/mo on tools that gave me worse data than a free browser workflow plus a decent analyst. What I needed was not more profile pages. I needed a stable company object and a repeatable way to poll it.</p>
<p>NinjaPear is much closer to that.</p>
<h2 id="linkedin-properly-said">LinkedIn, properly said</h2>
<p>One admin note I agree with completely: old articles used to dance around the word LinkedIn with weird euphemisms. That was a product-era artifact. In 2026, the honest wording is simpler.</p>
<p>Proxycurl relied heavily on LinkedIn-shaped workflows. That is part of why the legal risk became existential. NinjaPear does not scrape LinkedIn and is built around public-web company and employee data instead.</p>
<p>That is not just legal housekeeping. It changes how you design the system.</p>
<ul>
<li>LinkedIn URL as the canonical key: fragile</li>
<li>Company website as the canonical key: better</li>
<li>Fresh employee count via real-time web search: better</li>
<li>Funding plus updates plus headcount in one workflow: much better</li>
</ul>
<h2 id="make-data-driven-investment-decisions-with-headcount-tracking-software">Make data-driven investment decisions with headcount tracking software</h2>
<p>As 2026 rolls on, I still think investors need to go the extra mile to make sound decisions. Scouting high-growth companies using headcount growth and post-money valuation is still valid. If anything, it matters more in a selective market where capital is back, but not for everybody.</p>
<p>And yes, the original article used Proxycurl. That was true then. It is not the move now.</p>
<p>If I were rebuilding this workflow today, I would use:</p>
<ul>
<li><a href="https://nubela.co/company-api?ref=nubela.co">NinjaPear Company API</a> for company details, funding, and employee count</li>
<li><a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a> if I wanted company change data in an RSS workflow</li>
<li><a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> if I wanted a spreadsheet UI instead of raw API calls</li>
</ul>
<p>One more public signal on why timing beats static lists:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Tiny SaaS products with lean teams can throw off absurd margins.

Live on @acquiredotcom: profitable launch waitlist platform helping startups launch viral waitlists with ~3000 customers.

&gt; $170K ARR
&gt; $178K TTM revenue
&gt; $165K TTM profit</p>&mdash; Andrew Gazdecki (@agazdecki) <a href="https://x.com/agazdecki/status/2056468417830691001?ref=nubela.co">Mon May 18 20:14:12 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That is the caveat with headcount. Bigger is not automatically better. Sometimes lean teams are exactly the point. Which is why I never look at employee count alone. I look at headcount relative to funding, revenue, and what the company is actually shipping.</p>
<p>If you want a clean next step, start small. Track 20 companies monthly. Pull employee count, funding events, and updates. Then rank changes, not companies. That is where the edge usually is. And if you want to do that without building the plumbing yourself, start with NinjaPear’s free trial and hit the Employee Count endpoint first.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The Ultimate Guide to LinkedIn X-Ray Searches (2026 Update) ]]></title>
        <description><![CDATA[ A definitive guide to searching for and extracting interesting Professional Social Network profiles at scale with Professional Social Network X-ray searches. ]]></description>
        <link>https://nubela.co/blog/linkedin-x-ray-search-in-2024/</link>
        <guid isPermaLink="false">65b43054e44b0e0001f4d425</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Wed, 08 Jan 2025 10:26:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_429.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<div style="border:1px solid #e5e7eb;border-radius:12px;padding:16px;margin:20px 0 26px 0;background:#ffffff;box-shadow:0 1px 2px rgba(0,0,0,0.04);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
  <div style="font-weight:700;font-size:16px;margin-bottom:10px;">Compact LinkedIn X-ray search generator</div>
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:760px;">
    <input id="xr-role" placeholder="Job title, e.g. CTO" style="padding:10px 12px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;" />
    <input id="xr-location" placeholder="Location, e.g. Atlanta" style="padding:10px 12px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;" />
    <input id="xr-skill1" placeholder="Skill 1, e.g. React" style="padding:10px 12px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;" />
    <input id="xr-skill2" placeholder="Skill 2, e.g. Django" style="padding:10px 12px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;" />
    <input id="xr-exclude" placeholder="Exclude term, e.g. PHP" style="padding:10px 12px;border:1px solid #d1d5db;border-radius:8px;font-size:14px;grid-column:1 / span 2;" />
  </div>
  <div style="display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;">
    <button onclick="generateXray()" style="background:#111827;color:#fff;border:0;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer;">Generate query</button>
    <button onclick="copyXray()" style="background:#f3f4f6;color:#111827;border:1px solid #d1d5db;border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer;">Copy</button>
  </div>
  <div id="xr-output" style="margin-top:12px;padding:12px;border-radius:8px;background:#f9fafb;border:1px solid #e5e7eb;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.5;word-break:break-word;">site:linkedin.com/in/ "CTO" "Atlanta" (React OR Django) -PHP</div>
  <script>
    function generateXray() {
      const role = document.getElementById('xr-role').value.trim();
      const location = document.getElementById('xr-location').value.trim();
      const skill1 = document.getElementById('xr-skill1').value.trim();
      const skill2 = document.getElementById('xr-skill2').value.trim();
      const exclude = document.getElementById('xr-exclude').value.trim();
      let q = 'site:linkedin.com/in/';
      if (role) q += ' "' + role + '"';
      if (location) q += ' "' + location + '"';
      if (skill1 && skill2) q += ' (' + skill1 + ' OR ' + skill2 + ')';
      else if (skill1) q += ' "' + skill1 + '"';
      else if (skill2) q += ' "' + skill2 + '"';
      if (exclude) q += ' -' + exclude;
      document.getElementById('xr-output').textContent = q;
    }
    function copyXray() {
      const text = document.getElementById('xr-output').textContent;
      navigator.clipboard.writeText(text);
    }
  </script>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you are looking for the best <strong>linkedin xray search tool</strong>, the short answer is still Google plus a clean query builder. Start with <code>site:linkedin.com/in/</code>, then add exact titles, locations, and exclusion terms. That is still the fastest open-web method for finding public profiles outside LinkedIn’s own interface. But there’s a catch: this is a precision tool, not a whole sourcing system. One recruiter on Reddit said it better than most blog posts do.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/recruiting</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/VisualCelery</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">To be honest, not very often. The majority of my sourcing is on LinkedIn Recruiter, open-web and x-ray searches are usually only done for super tricky searches where we're not getting traction on LIR, or when the talent we're looking for doesn't typically use LinkedIn.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/recruiting/comments/1h0n8pl/anyone_actually_doing_xray_searches/lz57i9x/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the right frame. LinkedIn X-ray search is not magic. It is your sharp tool for awkward searches.</p>
<p>The rest of this article is the original guide, cleaned up, updated for LinkedIn, and trimmed where the old product references got stale.</p>
<h2 id="we-already-built-a-working-demo">We already built a working demo</h2>
<p>The old article linked to a Proxycurl demo. I replaced it with the compact generator above.</p>
<p>You can use it to generate a LinkedIn X-ray search based on:</p>
<ul>
<li>Job title</li>
<li>Location</li>
<li>One or two skills</li>
<li>One exclusion term</li>
</ul>
<p>For example, find CTOs based in Atlanta with React or Django, but exclude PHP. It is that easy.</p>
<p>Now, back to business.</p>
<h2 id="an-overview-of-some-search-methods">An overview of some search methods</h2>
<p>The first method uses Boolean operators such as <code>NOT</code>, <code>AND</code>, and <code>OR</code> within LinkedIn’s search engine to improve search results.</p>
<p>For example, let’s say you wanted to find and hire a content marketer or content strategist, but you wanted to make sure they were also writers themselves, as well as familiar with SEO standards.</p>
<p>Rather than sifting through thousands of profiles on LinkedIn to find the right prospect, you could use the following search query to instantly find them, <code>"content marketer" OR "content strategist" AND "writer" AND "SEO"</code>.</p>
<p>The second method for performing LinkedIn X-ray searches is Googling, but using operators to refine your results. The main difference is that we’re using Google’s search engine to find indexed LinkedIn pages instead of LinkedIn’s search engine.</p>
<p>We also don’t need to be logged into a LinkedIn account to do the second method, hence the name LinkedIn X-ray search, so there’s no need to burn your own account sessions just to test queries. Most people prefer this method because it scales better.</p>
<p>To give you an example, let’s take our earlier example and take a look at the Google search results for <code>LinkedIn content writer and SEO</code>.</p>
<p>Wow, that’s a lot. Let’s use a bit of magic and confine our search results to only LinkedIn:</p>
<p><code>site:linkedin.com/in/</code></p>
<p>Better. Now let’s refine that search query further with operators:</p>
<p><code>site:linkedin.com/in/ ("content marketer" OR "content strategist") "writer" "SEO"</code></p>
<p>Much better.</p>
<p>That said, in this article, I’ll be explaining how to use both methods to your advantage.</p>
<p>First, though, we need to talk a bit more about Boolean operators.</p>
<h2 id="what-are-boolean-operators">What are Boolean operators?</h2>
<p>A Boolean operator is a word or symbol used in logic and search queries to combine or exclude keywords, resulting in more focused and specific search results. It’s basically like searching on steroids.</p>
<p>Both LinkedIn and Google support the following core Boolean operators:</p>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Function</th>
<th>Example Usage</th>
</tr>
</thead>
<tbody>
<tr>
<td>AND</td>
<td>Results must include all specified terms</td>
<td><code>developer AND manager</code></td>
</tr>
<tr>
<td>OR</td>
<td>Results may include any of the specified terms</td>
<td><code>sales OR marketing</code></td>
</tr>
<tr>
<td>NOT</td>
<td>Excludes results containing the specified term, Google uses <code>-</code></td>
<td><code>engineer NOT civil</code></td>
</tr>
</tbody>
</table>
<h2 id="quick-heads-up">Quick heads up</h2>
<p>We’re about to get into examples of using search operators on LinkedIn and performing LinkedIn X-ray searches on Google. For the examples throughout this article, I’ll assume we’re working in some type of HR role and need to find a given individual to fill a job role.</p>
<p>If that’s not you, don’t overthink it. If you’re in sales or marketing, you can still use these same methods to find prospects for your use case. You just modify the query.</p>
<p>Okay, now let’s put this into practice.</p>
<h2 id="how-to-use-search-operators-on-linkedin">How to use search operators on LinkedIn</h2>
<p>On top of Boolean operators, LinkedIn also supports a few other search patterns:</p>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Function</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>" "</code></td>
<td>Search for an exact phrase</td>
<td><code>"product manager"</code></td>
</tr>
<tr>
<td><code>( )</code></td>
<td>Group terms in complex queries</td>
<td><code>(senior OR junior) AND engineer</code></td>
</tr>
<tr>
<td><code>first:</code></td>
<td>Search by first name</td>
<td><code>first:John</code></td>
</tr>
<tr>
<td><code>last:</code></td>
<td>Search by last name</td>
<td><code>last:Doe</code></td>
</tr>
</tbody>
</table>
<p>These can further help refine our search results.</p>
<p>First up, the <code>AND</code> operator.</p>
<h3 id="and-operators"><code>AND</code> operators</h3>
<p>So, let’s say we need to find a software engineer who lives in Los Angeles and has experience with both Javascript and Linux.</p>
<p>Here’s how we could use Boolean operators to help us here:</p>
<p><code>"software engineer" AND "los angeles" AND "javascript" AND "linux"</code></p>
<p>That gives us profiles that match all of our search criteria.</p>
<h3 id="not-operators"><code>NOT</code> operators</h3>
<p>Let’s say for whatever reason, the company we’re recruiting for doesn’t hire programmers that use Kotlin.</p>
<p>We can refine our search accordingly:</p>
<p><code>"software engineer" AND "los angeles" AND "javascript" AND "linux" NOT "kotlin"</code></p>
<p>You’ll see the search narrow slightly. The Kotlin-heavy profiles should disappear.</p>
<h3 id="filtering-with-location-and-putting-everything-together">Filtering with location and putting everything together</h3>
<p>We can take this one step further and assume everything above is true, but the company we’re recruiting for has offices in both Los Angeles and New York City.</p>
<p>We can expand our original search by alternating it slightly:</p>
<p><code>"software engineer" AND ("los angeles" OR "new york city") AND "javascript" AND "linux" NOT "kotlin"</code></p>
<p>This is where Boolean logic stops being theory and starts saving time.</p>
<h2 id="searching-on-linkedin-vs-google">Searching on LinkedIn vs. Google</h2>
<p>It may sound silly, but the main con of searching inside LinkedIn is that you need your own LinkedIn account and you need to be actively logged in.</p>
<p>You’ll also inevitably run into interface limits. This is old news for anyone who has tried to source at volume.</p>
<p>It’s simply not a very scalable method, and you can’t automate it cleanly for the most part.</p>
<p>This is why LinkedIn operators, while useful, are not quite as powerful as using Google to perform a true LinkedIn X-ray search without the same UI friction.</p>
<p>That said, let me show you how to do this in a better way using Google.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/recruiting</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/jlemien</span>
<span style="color:#878a8c;">· ▲ 11</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">It is just a term for using Boolean searches via Google. Things like: `Site:www.example.com` to only search for results from that website, `|` to indicate OR, using "quotation marks" for exact phrases, using `-` as NOT</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/recruiting/comments/1h0n8pl/anyone_actually_doing_xray_searches/lz5whzj/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="google-search-operators">Google search operators</h2>
<p>On top of <code>AND</code>, <code>OR</code>, and <code>NOT</code>, Google also supports additional search operators:</p>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Function</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>" "</code></td>
<td>Searches for an exact phrase</td>
<td><code>"climate change"</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td>Google’s version of NOT</td>
<td><code>jaguar -car</code></td>
</tr>
<tr>
<td><code>site:</code></td>
<td>Limits the search to a specific website or domain</td>
<td><code>site:nytimes.com</code></td>
</tr>
<tr>
<td><code>related:</code></td>
<td>Finds websites similar to a specified site</td>
<td><code>related:time.com</code></td>
</tr>
<tr>
<td><code>filetype:</code></td>
<td>Searches for a specific file type</td>
<td><code>filetype:pdf "renewable energy"</code></td>
</tr>
<tr>
<td><code>intitle:</code></td>
<td>Finds pages with a specific term in the title</td>
<td><code>intitle:conservation</code></td>
</tr>
<tr>
<td><code>inurl:</code></td>
<td>Searches for a specific term within the URL</td>
<td><code>inurl:nutrition</code></td>
</tr>
<tr>
<td><code>intext:</code></td>
<td>Searches for a specific term within the text of a page</td>
<td><code>intext:"global warming"</code></td>
</tr>
<tr>
<td><code>*</code></td>
<td>Acts as a wildcard</td>
<td><code>world * champion</code></td>
</tr>
<tr>
<td><code>AROUND(X)</code></td>
<td>Finds terms within a certain number of words apart</td>
<td><code>solar AROUND(3) energy</code></td>
</tr>
<tr>
<td><code>cache:</code></td>
<td>Shows the most recent cached version of a web page</td>
<td><code>cache:google.com</code></td>
</tr>
</tbody>
</table>
<p>We can use these operators to our advantage.</p>
<h2 id="how-to-do-linkedin-x-ray-searches">How to do LinkedIn X-ray searches</h2>
<p><code>site:linkedin.com/in/</code> is our starting point. It lets us search Google exclusively for LinkedIn profile results.</p>
<p>Note: if you want companies or jobs instead of people, the URL structure changes. Companies use <code>/company/</code>, for example <code>https://www.linkedin.com/company/microsoft/</code>, and jobs live under LinkedIn’s jobs URLs.</p>
<h3 id="linkedin-x-ray-searches-by-job-role">LinkedIn X-ray searches by job role</h3>
<p>So, let’s say we want to find a full-stack developer. Here’s how we could do that by using a LinkedIn X-ray search:</p>
<p><code>site:linkedin.com/in/ intitle:"full-stack developer"</code></p>
<p>All consisting of LinkedIn profiles having <code>full-stack developer</code> in their title.</p>
<h3 id="linkedin-x-ray-searches-by-job-role-and-skill">LinkedIn X-ray searches by job role and skill</h3>
<p>Now, let’s narrow that search down a bit and say we need them to be familiar with both Django and React:</p>
<p><code>site:linkedin.com/in/ intitle:"full-stack developer" (django OR react)</code></p>
<h3 id="excluding-skills-roles-or-anything-from-your-linkedin-x-ray-search">Excluding skills, roles, or anything from your LinkedIn X-ray search</h3>
<p>Next, let’s say we want the same as above, but we want to exclude PHP programmers.</p>
<p>Here’s how we could do that:</p>
<p><code>site:linkedin.com/in/ intitle:"full-stack developer" (intext:django OR intext:react) -php</code></p>
<p>That is much closer to what an actual sourcing query should look like.</p>
<h3 id="location-based-filtering-with-linkedin-x-ray-searches">Location-based filtering with LinkedIn X-ray searches</h3>
<p>One way to do this is by simply adding the location into the search:</p>
<p><code>site:linkedin.com/in/ intitle:"full-stack developer" "new york city" (django OR react) -php</code></p>
<p>You can get more specific too:</p>
<p><code>site:de.linkedin.com/in/ intitle:"full-stack developer" "frankfurt" (django OR react) -php</code></p>
<p>Not bad.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/recruiting</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/RecruitingLove</span>
<span style="color:#878a8c;">· ▲ 4</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I own a small recruiting firm and I just hired my most recent employee specifically because he is a master at this. And other reasons 😂 But I needed someone with this skill and it's paying off.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/recruiting/comments/1mjw3ka/stepbystep_how_to_xray_search_linkedin_using/n7f1olr/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="extracting-your-linkedin-x-ray-search-results">Extracting your LinkedIn X-ray search results</h2>
<p>Ideally, we want to automate and systemize as much as possible. Especially if you’re doing this at scale for recruiting.</p>
<p>To help accomplish this, we can use a tool like ValueSERP, which is a search engine result page API. Its job is to scrape search result pages at scale and return the data.</p>
<p>At the time of writing, public pricing pages still reference plans starting around <strong>$2.50 per 1,000 requests</strong>. Cheap enough for experimentation, assuming your workflow downstream is worth something.</p>
<p>This helps avoid future issues like CAPTCHAs or getting blocked if you try to brute-force Google the dumb way.</p>
<p>You can then export these results to a <code>.CSV</code> and process them downstream.</p>
<p>This is where LinkedIn X-ray searches truly shine: the programmatic nature of it, compared with traditional LinkedIn prospecting methods.</p>
<h2 id="how-to-enrich-linkedin-profiles">How to enrich LinkedIn profiles</h2>
<p>You now have a way to search for qualified prospects that meet specified criteria. You know how to search for LinkedIn profile URLs at scale and export the results without UI limitations.</p>
<p>But a LinkedIn profile URL alone doesn’t do us much good.</p>
<p>Sure, you could click that URL and then manually send them a connection request and try to message them. However, I would usually want their email and phone number for better touchpoints. All 3 if possible.</p>
<p>So, what’s an easy way to do that?</p>
<p>There are now two ways to think about this section:</p>
<ol>
<li><strong>The legacy Proxycurl way</strong>, if you are maintaining old workflows or old code.</li>
<li><strong>The NinjaPear way</strong>, if you want the current product path.</li>
</ol>
<h2 id="the-ninjapear-path">The NinjaPear path</h2>
<p>If I were doing this today, I would not build the workflow around LinkedIn scraping infrastructure from scratch unless I absolutely had to.</p>
<p>I would use <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> where it fits, especially for the enrichment layer and for workflows that begin from company, customer, or competitor data instead of profile URLs.</p>
<p>This part matters, so let me say it plainly: NinjaPear does <strong>not</strong> scrape LinkedIn, and it does <strong>not</strong> enrich LinkedIn profiles from a LinkedIn URL. That is a feature decision, not an omission.</p>
<p>Instead, NinjaPear gives you person and company enrichment from public web sources using cleaner inputs:</p>
<ul>
<li>for a <strong>person profile</strong>, bring a work email, or a <code>role + company</code>, or a <code>name + company</code></li>
<li>for a <strong>company profile</strong>, bring the company website or domain</li>
</ul>
<p>That means if your workflow begins with <code>https://www.linkedin.com/in/...</code>, NinjaPear is not a drop-in LinkedIn URL enricher. If your workflow begins with a real business identity signal, which in my experience is usually the smarter starting point anyway, NinjaPear is much more useful.</p>
<p>The first relevant product here is <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>. It is basically a spreadsheet with superpowers. You can start from a company domain, pull competitors, pull customer lists, search employees, and enrich work emails without having to juggle a CSV circus.</p>
<p>That matters because a lot of teams do not actually need “LinkedIn X-ray search” as an end in itself. They need a list of target accounts, the right people at those accounts, and a way to contact them. Different problem. Better solved upstream.</p>
<p>The second relevant product is NinjaPear’s Employee API and Company API stack, which can enrich person and company data from public web sources without forcing your whole workflow to depend on LinkedIn page URLs.</p>
<p>And this is the part most people miss: NinjaPear’s <strong>Employee API</strong> does a big chunk of the practical work people use a linkedin xray search tool for in the first place. If your real question is not “how do I search Google better?” but “how do I find the right employees at target companies?”, Employee API is usually the more direct route.</p>
<p>In practice, that means you can:</p>
<ul>
<li>start with a company website</li>
<li>search employees by role or seniority</li>
<li>pull a person profile from <code>work email</code>, <code>role + company</code>, or <code>name + company</code></li>
<li>enrich the company itself from the website</li>
<li>add work email lookup</li>
</ul>
<p>That is a lot closer to an actual recruiting or sales workflow than open-web query tinkering.</p>
<p>If your actual goal is:</p>
<ul>
<li>build prospect lists,</li>
<li>identify decision-makers,</li>
<li>enrich profiles,</li>
<li>get work emails,</li>
<li>monitor account activity,</li>
</ul>
<p>then NinjaPear is the modern route.</p>
<p>If your actual goal is specifically “I need a Google query that finds public LinkedIn profiles,” then keep reading. X-ray search still has its place.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/recruiting</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Kooky-Ad-5121</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Like 2-4 days per year. It can be useful if you have approached all the obvious candidates on LinkedIn. But, I feel it is a very tiresome road. You have to put in like 4 times the work to get the same amount of responses...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/recruiting/comments/1h0n8pl/anyone_actually_doing_xray_searches/lz5ddno/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That comment is blunt, but correct. Most people do not want a clever query. They want a list that is ready to use.</p>
<h2 id="the-legacy-proxycurl-path">The legacy Proxycurl path</h2>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div style="border:1px solid #d6d6d6;border-radius:10px;padding:14px 16px;margin:18px 0 24px 0;background:#fafafa;">
  <div style="font-weight:700;margin-bottom:8px;">Quick note before we begin</div>
  <div style="font-size:15px;line-height:1.55;">Proxycurl, the product originally referenced throughout this guide, has been sunset. The founder behind Proxycurl is now building NinjaPear. I am retaining the useful Proxycurl parts of this article because the workflow is still educational, but where it makes sense, I have updated the guide with the modern NinjaPear path too.</div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>I’m keeping this section because the original article had useful implementation detail, and some readers still maintain old Proxycurl-based flows.</p>
<p>But to be explicit: <strong>Proxycurl has been sunset</strong>.</p>
<h3 id="proxycurls-person-profile-endpoint">Proxycurl’s Person Profile Endpoint</h3>
<p>One of the key endpoints of Proxycurl was the Person Profile Endpoint, which allowed you to extract data from public LinkedIn profiles such as education, employment, skills, and everything you would find on a LinkedIn profile.</p>
<p>The broader lesson still holds: once you have profile URLs, you can enrich them and turn search results into structured data.</p>
<h3 id="using-proxycurls-api-for-enrichment">Using Proxycurl’s API for enrichment</h3>
<p>In the original version of this article, I showed a Python example that took a LinkedIn profile URL and enriched it through Proxycurl’s API.</p>
<p>That workflow looked roughly like this:</p>
<pre><code class="language-python">import requests

api_key = 'Your_API_Key_Here'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/v2/linkedin'
params = {
    'linkedin_profile_url': 'https://www.linkedin.com/in/russellbrunson/',
    'extra': 'include',
    'github_profile_id': 'include',
    'facebook_profile_id': 'include',
    'twitter_profile_id': 'include',
    'personal_contact_number': 'include',
    'personal_email': 'include',
    'inferred_salary': 'include',
    'skills': 'include',
    'use_cache': 'if-present',
    'fallback_to_cache': 'on-error',
}

response = requests.get(api_endpoint, params=params, headers=headers)
print(response.text)
</code></pre>
<p>I’ve compacted this on purpose. The original article had several long code listings, but the core point was never the boilerplate. The point was that once you have the LinkedIn URL, you can enrich it programmatically.</p>
<h3 id="how-to-easily-enrich-linkedin-profiles-at-scale">How to easily enrich LinkedIn profiles at scale</h3>
<p>The same applied in bulk. You could read profile URLs from a <code>.CSV</code>, hit the enrichment endpoint, and write the results to a new <code>.CSV</code>.</p>
<p>That old workflow still describes the shape of the problem correctly:</p>
<ul>
<li>find URLs,</li>
<li>enrich them,</li>
<li>export them,</li>
<li>route them into outreach or CRM.</li>
</ul>
<p>It is just no longer the product path I would recommend starting fresh with.</p>
<h2 id="search-inside-a-dataset-instead">Search inside a dataset instead</h2>
<p>The original article also covered Proxycurl’s Person Search Endpoint, which let you search a structured profile dataset directly instead of first discovering profile URLs through Google.</p>
<p>That idea is still important. If you already have a person dataset, searching the dataset is almost always cleaner than scraping the open web and then enriching after the fact.</p>
<p>This is also where NinjaPear is more interesting in 2026.</p>
<p>With NinjaPear, I would increasingly start from the company side, then move to people:</p>
<ul>
<li>start with a domain or target account list,</li>
<li>pull competitors or customers,</li>
<li>search employees,</li>
<li>enrich work emails,</li>
<li>optionally monitor the company for changes.</li>
</ul>
<p>That is a more commercially useful pipeline than “Google query first, figure out the rest later.”</p>
<h2 id="comparison-three-ways-to-do-it">Comparison: three ways to do it</h2>
<p>If you are deciding between LinkedIn search, Google X-ray, and a structured data platform, here is the blunt version.</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>Best for</th>
<th>Data quality</th>
<th>Pricing</th>
<th>Ease of use</th>
<th>Automation</th>
<th>Support</th>
<th>Average</th>
</tr>
</thead>
<tbody>
<tr>
<td>LinkedIn native search</td>
<td>Quick manual lookup</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.0/5</td>
</tr>
<tr>
<td>Google LinkedIn X-ray search</td>
<td>Hard-to-find public profiles</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.2/5</td>
</tr>
<tr>
<td>NinjaPear workflow</td>
<td>Prospecting + enrichment + monitoring</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>4.2/5</td>
</tr>
</tbody>
</table>
<p>I’m biased here, obviously. But the bias comes from spending years watching teams confuse a sourcing trick with a sourcing system.</p>
<p>LinkedIn X-ray search is a trick. A useful one. NinjaPear is closer to a system.</p>
<h2 id="if-you-are-entirely-uninterested-in-coding">If you are entirely uninterested in coding</h2>
<p>The original article had a no-code section because, frankly, most people reading this do not want to maintain Python scripts forever.</p>
<p>That point remains true.</p>
<p>If you want a no-code route today, the cleanest modern path is to use <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>. Start with a domain, expand to competitors or customers, search employees, then add work-email enrichment as a column.</p>
<p>That is a lot less annoying than stitching together Google, a SERP API, a CSV export, and a separate enrichment step.</p>
<h2 id="additional-tips">Additional tips</h2>
<p>A few things that still matter if you are doing LinkedIn X-ray search in 2026:</p>
<ol>
<li><strong>Use exact phrases first.</strong> <code>"VP Sales"</code> beats <code>VP Sales</code>.</li>
<li><strong>Prefer Google exclusions over wishful thinking.</strong> <code>-recruiter -jobs -hiring</code> often cleans up garbage fast.</li>
<li><strong>Use country-specific subdomains when relevant.</strong> <code>site:de.linkedin.com/in/</code> or <code>site:uk.linkedin.com/in/</code> can help.</li>
<li><strong>Do not assume every public profile is fresh.</strong> Indexed does not mean current.</li>
<li><strong>Do not mistake discoverability for contactability.</strong> Finding a profile is step one, not the outcome.</li>
</ol>
<h2 id="you-now-have-three-options">You now have three options</h2>
<ol>
<li>You can take your newly gained knowledge and do nothing with it.</li>
<li>You can take your newly gained knowledge about LinkedIn X-ray searches and implement it manually.</li>
<li>You can use a linkedin xray search tool where it helps, then move the rest of the workflow into a proper system.</li>
</ol>
<p>If you are starting from scratch in 2026, I would do #3.</p>
<p>Use the generator above to build your query. Test whether the open web actually surfaces the profiles you need. If it does, good.</p>
<p>If you then need enrichment, list-building, work emails, or company monitoring, move that work into NinjaPear instead of building a brittle pile of scripts around a sourcing trick. Come in with a work email, <code>name + company</code>, <code>role + company</code>, or a company website. That is how NinjaPear wants to work, and honestly, that constraint usually improves the workflow.</p>
<p>If you want the more modern path, start with <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. If your real use case is “find the right people at a target company,” <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> and NinjaPear’s Employee API will get you further than a pure LinkedIn X-ray workflow. If you specifically need to monitor target accounts for timing signals after you build the list, <a href="https://nubela.co/monitor-api?ref=nubela.co">Company Monitor</a> is the natural next step.</p>
<p>LinkedIn X-ray search is still useful. It is just no longer the whole game.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Best Data Enrichment Tools for 2026 ]]></title>
        <description><![CDATA[ Discover 13 top company data enrichment tools in 2025 and how to find your fit. 1. Proxycurl 2. Clearbit 3. Zoominfo 4. UpLead 4. Adapt.io ]]></description>
        <link>https://nubela.co/blog/13-best-company-data-enrichment-tools-in-2025-free-paid/</link>
        <guid isPermaLink="false">675cc64cb4546d00014e8977</guid>
        <category><![CDATA[ company data enrichment ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Tue, 31 Dec 2024 10:36:30 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_428.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Google search <a href="https://nubela.co/blog/best-data-enrichment-tools/">"data enrichment"</a> and you will get countless data enrichment tools, all promising the freshest, fastest, and most accurate data. Now, switch your search to "company data enrichment". You will find similar search results, the same typical tools without any distinction.</p>
<p>Usually most data providers offer both individual data enrichment, focused on people, and company data enrichment, focused on businesses, but the nuances often get lost in between. And if company data enrichment is what you're looking for, you need a list of providers that excel in that area rather than your common run of the mill list of general data enrichment providers.</p>
<p>Let me ease your search by providing you a list of the top company data enrichment providers to consider as we head into 2026. I'll also share key criteria and metrics to help you choose the right provider for your needs, so you get the most value out of it.</p>
<blockquote>
<p><strong>Quick update before we start:</strong> Proxycurl API has been sunset. I founded Proxycurl, and the work has now moved into <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, where we're building a broader B2B data and competitive intelligence platform. I am keeping Proxycurl in this list because a lot of buyers still search for it by name, and the product shaped how many teams think about API-first enrichment in the first place.</p>
</blockquote>
<p>I'll kick things off with an overview of all company enrichment tools before we take a look at each one.</p>
<p><img alt="13 different top company data enrichment tools in 2025" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Table-13-Best-Company.png" /></p>
<p>13 best company data enrichment tools of 2026</p>
<p>Now, let's walk through each one of these tools.</p>
<h2 id="best-data-enrichment-tools-for-2026">Best Data Enrichment Tools for 2026</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th>Data quality</th>
<th>Pricing</th>
<th>Ease of use</th>
<th>API</th>
<th>Avg. score</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear</td>
<td>Company enrichment + competitive intelligence</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.6/5</td>
</tr>
<tr>
<td>Proxycurl (sunset)</td>
<td>Legacy API-first enrichment users</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.0/5</td>
</tr>
<tr>
<td>Clearbit</td>
<td>HubSpot-centric enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>3.6/5</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td>Large US sales teams</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>3.4/5</td>
</tr>
<tr>
<td>UpLead</td>
<td>SMB prospecting</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.6/5</td>
</tr>
<tr>
<td>Adapt.io</td>
<td>Budget-friendly basic enrichment</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.4/5</td>
</tr>
<tr>
<td>Datanyze</td>
<td>Technographics</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.2/5</td>
</tr>
<tr>
<td>Cognism</td>
<td>Europe-heavy sales teams</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>3.4/5</td>
</tr>
<tr>
<td>Lead411</td>
<td>Trigger-based outbound</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.6/5</td>
</tr>
<tr>
<td>Apollo.io</td>
<td>All-in-one sales engagement</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>3.6/5</td>
</tr>
<tr>
<td>Data Axle</td>
<td>Compliance-heavy firmographic data</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.0/5</td>
</tr>
<tr>
<td>LinkedIn Sales Navigator</td>
<td>Native LinkedIn workflow</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.2/5</td>
</tr>
<tr>
<td>Leadspace</td>
<td>Enterprise ICP modeling</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>3.4/5</td>
</tr>
<tr>
<td>Owler</td>
<td>Competitive snapshots</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.4/5</td>
</tr>
</tbody>
</table>
<h3 id="1-ninjapear">1. <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></h3>
<p>NinjaPear is the tool I would put on this list first because it is not trying to be just another company enrichment vendor. It does enrichment, yes, but it also maps business relationships and competitive signals that normal enrichment vendors do not touch.</p>
<p>If your workflow starts with a company website and ends with a live account map, NinjaPear is unusually strong. You can enrich company profiles, pull employee count, find customer relationships, monitor company changes across blog, X, and website updates, and use it via API, spreadsheet-style workflows, or AI tools like Claude.</p>
<p>What I like is that the product is honest about what it is. It is not pretending to be a generic lead database with a prettier UI. It is trying to be a live map of businesses, which is a more useful framing if you care about timing and account context.</p>
<h4 id="ninjapear-key-features">NinjaPear Key Features</h4>
<ul>
<li>Company profile enrichment with industry, founders, headcount, funding, and addresses.</li>
<li>Customer API to identify which companies buy from a vendor.</li>
<li><a href="https://nubela.co/monitor-api?ref=nubela.co">Company Monitor</a> for tracking company blog posts, X posts, and website changes in one feed.</li>
<li>Employee and work email enrichment.</li>
<li>Competitive intelligence data that goes beyond standard firmographics.</li>
<li>Usage-based pricing with no monthly minimums.</li>
</ul>
<h4 id="ninjapear-pros">NinjaPear Pros</h4>
<ul>
<li>Broader than standard data enrichment tools.</li>
<li>Strong for account research, prospecting, and competitor tracking.</li>
<li>API-first, but also usable in spreadsheets and AI workflows.</li>
<li>Transparent free trial: 3 days, 10 credits, no credit card required.</li>
</ul>
<h4 id="ninjapear-cons">NinjaPear Cons</h4>
<ul>
<li>If all you need is a simple CSV append vendor, NinjaPear may be more product than you need.</li>
<li>Some of the highest-leverage use cases assume you know how to operationalize signals, not just collect them.</li>
</ul>
<h4 id="ninjapear-pricing">NinjaPear Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free trial</td>
<td>3-day free trial ✅  10 credits included</td>
</tr>
<tr>
<td>Paid</td>
<td>Usage-based pricing, no monthly minimums</td>
</tr>
</tbody>
</table>
<h3 id="2-proxycurl">2. <a href="http://nubela.co/proxycurl?ref=nubela.co">Proxycurl</a></h3>
<blockquote>
<p><strong>Note:</strong> Proxycurl API has been sunset. I left this section here on purpose because many teams still search for Proxycurl when comparing data enrichment tools, and because the product mattered. If you are evaluating options today, start with NinjaPear instead.</p>
</blockquote>
<p>Made for developers, Proxycurl took the API-first approach to another level. With an exhaustive dataset of millions of companies and individuals around the globe, no information was out of your grasp. That is without mentioning the huge portfolio of API endpoints which scraped and enriched profiles, providing a variety of data points.</p>
<p>The Company Profile Endpoint in particular allowed you to enrich your company data in real-time. You could add or remove parameters, based on what you needed. Make the most of Proxycurl's APIs flexibly and integrate them into any existing applications and workflows.</p>
<p>Here is an example Company Profile Endpoint API request to pull company data for Tesla:</p>
<pre><code class="language-python">import requests

api_key = 'YOUR_API_KEY'

headers = {'Authorization': 'Bearer ' + api_key}

api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/company'

params = {
    'url': 'https://www.linkedin.com/company/tesla/',
    'categories': 'include',
    'funding_data': 'include',
    'exit_data': 'include',
    'acquisitions': 'include',
    'extra': 'include',
    'use_cache': 'if-present',
    'fallback_to_cache': 'on-error',
}

response = requests.get(api_endpoint,
                params=params,
                headers=headers)
</code></pre>
<p>Proxycurl offered multiple endpoints, so you had the option to target and enrich specific data fields.</p>
<p>Under Company Profile APIs, you could find the following endpoints:</p>
<ul>
<li>Company Profile Endpoint: Enrich company profiles with structured data like funding &amp; investments data, locations, industries etc.</li>
<li>Company Lookup Endpoint: Get a company's profile URL using their name, website and/or location.</li>
<li>Employee Search Endpoint: Get the profile URL of employees using their job title.</li>
<li>Employee Listing Endpoint: Get a list of past and present employees of a company.</li>
<li>Employee Count Endpoint: Get the number of employees in a company.</li>
<li>Company Profile Picture Endpoint: Get a company's LinkedIn profile picture.</li>
</ul>
<p>Proxycurl had over 21 APIs that scraped individual and company data in real-time.</p>
<p>Proxycurl's LinkDB also deserved a shout. With over 500 million LinkedIn profiles and more than 40 detailed data points, you could build and scale your business, identify promising talents, discover investment opportunities, and more.</p>
<h4 id="proxycurl-key-features">Proxycurl Key Features</h4>
<ul>
<li>Enrich professional profiles of companies and individuals.</li>
<li>Real-time enrichment with company data, including employee count and funding rounds.</li>
<li>Multiple APIs tailored for easy integration into custom workflows.</li>
<li>Supports bulk data enrichment through scalable API endpoints.</li>
</ul>
<h4 id="proxycurl-pros">Proxycurl Pros</h4>
<ul>
<li>Real-time data enrichment and a data freshness guarantee to top that up.</li>
<li>Affordable pricing.</li>
<li>Highly customizable, perfect for developers.</li>
<li>Granular insights into company and individual data.</li>
</ul>
<h4 id="proxycurl-cons">Proxycurl Cons</h4>
<ul>
<li>Perfect for developers, might be a learning curve for non-technical users.</li>
<li>Sunset product, so not the right choice for new evaluations in 2026.</li>
</ul>
<h4 id="proxycurl-pricing">Proxycurl Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Legacy reference</td>
<td>Previously from $49/mo</td>
</tr>
<tr>
<td>Current status</td>
<td>Sunset</td>
</tr>
</tbody>
</table>
<h3 id="3-clearbit">3. <a href="https://clearbit.com/?ref=nubela.co">Clearbit</a></h3>
<p>Clearbit is a company data enrichment tool that instantly upgrades your data game. HubSpot's acquisition only goes to show how important the product became.</p>
<p>Clearbit powers their data enrichment with machine learning. It combines first-party data and third-party sources to enrich company profiles with 100+ firmographic and technographic data points that automatically update every 30 days.</p>
<p>One feature that really stands out for me is its ability to pair company data with decision-maker insights, creating a two-way approach to enrichment.</p>
<h4 id="clearbit-key-features">Clearbit Key Features</h4>
<ul>
<li>Automatically updates records every 30 days.</li>
<li>Added decision-maker data with contact details and roles.</li>
<li>Supports updates to back-end systems with APIs and webhooks.</li>
</ul>
<h4 id="clearbit-pros">Clearbit Pros</h4>
<ul>
<li>Offers both real-time API and batch enrichment options.</li>
<li>Integrated with HubSpot, an all-in-one CRM platform.</li>
</ul>
<h4 id="clearbit-cons">Clearbit Cons</h4>
<ul>
<li>Users report instances of getting false data and sometimes non-existent emails.</li>
<li>Pricing is not transparent and predictable.</li>
</ul>
<h4 id="clearbit-pricing">Clearbit Pricing</h4>
<p>Clearbit's previous pricing is no longer relevant. You will have to contact HubSpot to get a quote.</p>
<h3 id="4-zoominfo">4. <a href="https://www.zoominfo.com/?ref=nubela.co">ZoomInfo</a></h3>
<p>ZoomInfo boasts datasets of over 14 million companies and remains one of the most well-renowned B2B lead enrichment platforms. Aside from enrichment, ZoomInfo also supplies marketing and recruitment solutions.</p>
<p>One thing to note is their data is pretty US-centric, so if you're looking for wider geographical coverage, ZoomInfo might come up short. It doesn't take away the fact that they provide a variety of solutions, and different packages for data enrichment.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/hubspot</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Proxima_Centauri_C</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">My company currently uses ZoomInfo instant enrich to populate missing contact data at the time of contact creation (via form fill, etc). Getting this data populated instantly and accurately is crucial for us because we depend on it for automated lead routing. I’m reviewing alternatives due to concerns from the top about ZoomInfo’s price, and complaints raised from the sales team about data accuracy.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/hubspot/comments/1gtftar/alternatives_to_zoominfo_instant_enrich/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h4 id="zoominfo-key-features">ZoomInfo Key Features</h4>
<ul>
<li>Combines firmographics with buyer intent data for advanced targeting.</li>
<li>Variety of data packages, catering to almost all data needs.</li>
<li>Provides insights into competitors and market positioning.</li>
</ul>
<h4 id="zoominfo-pros">ZoomInfo Pros</h4>
<ul>
<li>Segmented solutions to complement data enrichment, sales, marketing, recruitment.</li>
<li>Granular data packages.</li>
<li>Vast B2B company database for deep research.</li>
<li>Excellent for identifying and targeting high-value prospects.</li>
<li>Combines enrichment with advanced analytics like intent signals.</li>
</ul>
<h4 id="zoominfo-cons">ZoomInfo Cons</h4>
<ul>
<li>Criticized for prioritizing new features at the expense of its core product.</li>
<li>Too many data package options bring add-on costs.</li>
<li>The platform's complexity may feel overwhelming for casual users.</li>
</ul>
<h4 id="zoominfo-pricing">ZoomInfo Pricing</h4>
<p>Their pricing information is not publicly available, although some sources claim their plan starts from $14,995/year.</p>
<h3 id="5-uplead">5. <a href="https://www.uplead.com/?ref=nubela.co">UpLead</a></h3>
<p>The <a href="https://www.g2.com/products/uplead/reviews?ref=nubela.co">highest rated</a> B2B data provider in G2, UpLead turns your messy list of prospects into sales opportunities. Their huge database helps you find and connect leads, to drive higher conversions.</p>
<p>I have to rate UpLead, not just for its company data enrichment ability, but also for making them actionable. You get a clean prospecting list, which you can then plug into your CRM without duplicating, risking, or losing the customer records.</p>
<h4 id="uplead-key-features">UpLead Key Features</h4>
<ul>
<li>Large database of over 160 million business contacts in over 200 countries.</li>
<li>Advanced filters with 50+ fields.</li>
<li>Real-time email verification.</li>
</ul>
<h4 id="uplead-pros">UpLead Pros</h4>
<ul>
<li>Commendable user interface, allows very precise searches.</li>
<li>Provides detailed contact information, email and phone number.</li>
<li>Excellent tracking of lookups.</li>
</ul>
<h4 id="uplead-cons">UpLead Cons</h4>
<ul>
<li>Higher data coverage emphasis on the North American region.</li>
<li>The number of "valid" leads cuts down the amount of total leads. Even if a large amount of leads are generated, only a small % of them are pursuable valid leads.</li>
</ul>
<h4 id="uplead-pricing">UpLead Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>7 day free trial available ✅  5 credits</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$99/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Customizable usage and pricing</td>
</tr>
</tbody>
</table>
<p><em><strong>Note:</strong> Free trials require credit card information to activate.</em></p>
<h3 id="6-adaptio">6. <a href="https://www.adapt.io/?ref=nubela.co">Adapt.io</a></h3>
<p>Adapt.io is a company data enrichment tool that provides actionable data to align with your outreach strategies. You get enriched profiles through attributes like direct dial numbers and department information.</p>
<p>The tool also allows you to enrich your incomplete data from other sources, you can update a CSV file, update your CRM or directly use their API.</p>
<h4 id="adaptio-key-features">Adapt.io Key Features</h4>
<ul>
<li>Multiple data points including funding information and department-wise employee count.</li>
<li>Uses APIs to complete missing B2B data points in your CRM.</li>
<li>Data coverage of over 3,000+ industries with granular filters. For instance, under SaaS, you can search for Fintech SaaS, HRTech SaaS, eCommerce SaaS, and more.</li>
</ul>
<h4 id="adaptio-pros">Adapt.io Pros</h4>
<ul>
<li>Affordable pricing.</li>
<li>Ideal for marketing campaigns that require firmographic segmentation.</li>
<li>Supports integration with popular CRM platforms.</li>
</ul>
<h4 id="adaptio-cons">Adapt.io Cons</h4>
<ul>
<li>Limited data coverage in European regions.</li>
<li>Features focused primarily on marketing, limiting its use in other areas.</li>
</ul>
<h4 id="adaptio-pricing">Adapt.io Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free Plan Available ✅  25 Email Credits  25 Enrichment Credits  25 Contacts per day</td>
</tr>
<tr>
<td>Basic paid</td>
<td>$49/mo</td>
</tr>
<tr>
<td>High-end paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<h3 id="7-datanyze">7. <a href="https://www.datanyze.com/?ref=nubela.co">Datanyze</a></h3>
<p>Built for salespeople, Datanyze enriches prospect profiles in real-time, while you're browsing LinkedIn. It uses web crawlers to identify a company's technology stack and usage, which helps you identify potential customers. How? It scans the code, tags, and metadata on company websites to detect specific software or technologies in use, helping you pinpoint businesses using tools relevant to your offering.</p>
<h4 id="datanyze-key-features">Datanyze Key Features</h4>
<ul>
<li>Specializes in technographics, providing insights into a company's tech stack.</li>
<li>Allows filtering and targeting based on technology usage.</li>
</ul>
<h4 id="datanyze-pros">Datanyze Pros</h4>
<ul>
<li>Unparalleled depth in technology usage data.</li>
<li>Highly effective for targeting IT and SaaS companies.</li>
</ul>
<h4 id="datanyze-cons">Datanyze Cons</h4>
<ul>
<li>Limited enrichment for non-technographic company data.</li>
<li>No integrations to update CRMs and other systems.</li>
<li>Users have criticized the tool previously for data inaccuracy.</li>
</ul>
<h4 id="datanyze-pricing">Datanyze Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>90 Day Free Trial ✅  10 credits per month</td>
</tr>
<tr>
<td>Basic paid</td>
<td>$29/mo</td>
</tr>
<tr>
<td>High-end paid</td>
<td>$55/mo</td>
</tr>
</tbody>
</table>
<h3 id="8-cognism">8. <a href="https://www.cognism.com/?ref=nubela.co">Cognism</a></h3>
<p>Cognism is a popular company data enrichment tool, with a focus on technographic and intent data. Similar to Adapt.io, Cognism helps you fill the gaps in your incomplete prospect lists. The database is updated on a regular basis, so once you connect your CRM to the platform, you can be assured your leads are never stale.</p>
<p>One unique aspect of Cognism is its emphasis on intent-based targeting. You get insights into companies actively researching products or services in your domain. Unlike most tools that prioritize North American markets, Cognism offers robust data coverage across Europe as well.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/hubspot</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/zipzapzob</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Cognism for mobile numbers and Apollo for email addresses.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/hubspot/comments/1gtftar/alternatives_to_zoominfo_instant_enrich/lxlrtat/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h4 id="cognism-key-features">Cognism Key Features</h4>
<ul>
<li>CCPA and GDPR-compliant.</li>
<li>Supports integration with popular platforms like Salesforce, HubSpot, Pipedrive, Microsoft Dynamics, Outreach, and Salesloft.</li>
<li>Data entry cleansing to prevent CRM pollution.</li>
<li>Automated data validation saves time.</li>
</ul>
<h4 id="cognism-pros">Cognism Pros</h4>
<ul>
<li>Wider geographical data coverage.</li>
<li>Combines firmographic enrichment with intent-based insights.</li>
<li>Supports integration with a large pool of tech stack.</li>
</ul>
<h4 id="cognism-cons">Cognism Cons</h4>
<ul>
<li>Advanced features can feel complex.</li>
<li>Cognism is self-declared GDPR compliant, and that has attracted criticism from some reviewers.</li>
</ul>
<h4 id="cognism-pricing">Cognism Pricing</h4>
<p>Their pricing information is not public. You will have to contact them to request a quote.</p>
<h3 id="9-lead411">9. <a href="https://www.lead411.com/?ref=nubela.co">Lead411</a></h3>
<p>My next entry in this list is Lead411, a company data enrichment tool that provides actionable company data enriched with verified intent signals and contact information. I'm not sure of their claim as the "Only Unlimited B2B data provider" but it is an excellent choice if you're looking for a tool that focuses on identifying companies showing signs of readiness to buy.</p>
<p>What sets Lead411 apart is its verified email accuracy. You don't just get enriched company data, but also reliable communication channels to reach decision-makers. Features like trigger events notify you of key changes in a company, such as funding rounds or hiring sprees.</p>
<h4 id="lead411-key-features">Lead411 Key Features</h4>
<ul>
<li>Trigger events highlight major business activities like funding or expansions.</li>
<li>Verified B2B contact email addresses using open email validation.</li>
<li>Supports integration with 20+ CRMs.</li>
</ul>
<h4 id="lead411-pros">Lead411 Pros</h4>
<ul>
<li>Email verification ensures high email accuracy rates and reduced bounce rates for outreach campaigns.</li>
</ul>
<h4 id="lead411-cons">Lead411 Cons</h4>
<ul>
<li>US-centric dataset, insufficient data from other regions like Europe, Asia and Latin America.</li>
</ul>
<h4 id="lead411-pricing">Lead411 Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>7 days free trial ✅  50 Exports</td>
</tr>
<tr>
<td>Basic paid</td>
<td>$99/mo</td>
</tr>
<tr>
<td>High-end paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<h3 id="10-apolloio">10. <a href="https://www.apollo.io/?ref=nubela.co">Apollo.io</a></h3>
<p>Apollo.io has one sole purpose, boost sales engagement to the max. A company data enrichment tool that refreshes your systems with their contact databases. Since sales is their area of focus, the platform automates emails, marketing and sales processes, sequences touchpoints, and sales call dialing.</p>
<p>Notable features of Apollo.io include their Enrich feature and the Data Health Center. It can identify incomplete data, flag inaccurate data, or outdated data, and track contacts without email addresses in your CRM.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We've actually already started deprecating ZoomInfo and Apollo. Both were being used for enrichment purposes. But we have had many, many data quality issues with them. We are starting to invest more heavily in Clay and...</p>&mdash; Qualitate (@qualitateio) <a href="https://x.com/qualitateio/status/2054174422060163200?ref=nubela.co">Tue May 12 12:18:41 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h4 id="apolloio-key-features">Apollo.io Key Features</h4>
<ul>
<li>Enriches company data with over 275 million contacts and detailed firmographics for improved targeting.</li>
<li>Data Health Center flags inaccurate data and completes missing data points.</li>
<li>Exhaustive US-centric data.</li>
<li>Notifies and schedules automatic enrichment on new updates.</li>
</ul>
<h4 id="apolloio-pros">Apollo.io Pros</h4>
<ul>
<li>65+ advanced search filters.</li>
<li>Serious automation features, almost every repetitive sales and marketing task can be automated.</li>
<li>Seamless integration with CRMs like Salesforce for workflow efficiency.</li>
</ul>
<h4 id="apolloio-cons">Apollo.io Cons</h4>
<ul>
<li>Limited data outside of the US.</li>
<li>Full-on automation poses a risk of losing personal touch.</li>
<li>High tier pricing, hard to access for small businesses and startups.</li>
<li>Not GDPR compliant.</li>
</ul>
<h4 id="apolloio-pricing">Apollo.io Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free Plan Available ✅  1,200 Credits / year</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$59/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$149/user/mo</td>
</tr>
</tbody>
</table>
<h3 id="11-data-axle-formerly-infogroup">11. <a href="https://www.data-axle.com/?ref=nubela.co">Data Axle (Formerly InfoGroup)</a></h3>
<p>Infogroup, now rebranded as Data Axle, continues to deliver enriched company data, complemented by robust firmographics and advanced segmentation tools. The depth of Data Axle's data collection is amazing. They use verified public records, business registrations, and direct phone verification to verify their data.</p>
<p>Personally, I have to commend them on their ability to provide hyper-specific segmentation. You can target companies based on criteria like location, revenue, or even niche industries.</p>
<h4 id="data-axle-key-features">Data Axle Key Features</h4>
<ul>
<li>Processing services like data hygiene, data enhancement and email append ensure data accuracy.</li>
<li>Offers reliable data verified through public records and direct calls.</li>
</ul>
<h4 id="data-axle-pros">Data Axle Pros</h4>
<ul>
<li>Extremely accurate data due to rigorous verification processes.</li>
<li>Ideal for industries requiring compliance and precision, like finance.</li>
<li>Supports deep segmentation for precise targeting.</li>
</ul>
<h4 id="data-axle-cons">Data Axle Cons</h4>
<ul>
<li>Over-reliance on historical data, data updates may not suit fast-paced industries.</li>
<li>High-end pricing.</li>
</ul>
<h4 id="data-axle-pricing">Data Axle Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>30 day free trial ✅</td>
</tr>
<tr>
<td>Pay-as-you-go</td>
<td>$17.95 per credit report</td>
</tr>
<tr>
<td>Basic Paid (Monthly)</td>
<td>$195/mo</td>
</tr>
<tr>
<td>Basic Paid (Annual)</td>
<td>$179/mo</td>
</tr>
</tbody>
</table>
<h3 id="12-linkedin-sales-navigator">12. <a href="https://business.linkedin.com/sales-solutions/sales-navigator?ref=nubela.co">LinkedIn Sales Navigator</a></h3>
<p>LinkedIn has their very own tool that grants access to LinkedIn's network and professional data. Tapping into that data means you get valuable insights for sales intelligence, lead generation, and market research.</p>
<p>With LinkedIn Sales Navigator API, you can create a custom dashboard to keep an eye on prospects. The dashboard will automatically update whenever a company updates their profile, so you're always in the loop.</p>
<p>Accessing LinkedIn Sales Navigator is not simple. You have to file an application for access with details on how you're going to use the data. The approval process can take several weeks, and there is no guarantee you will be approved.</p>
<h4 id="linkedin-sales-navigator-key-features">LinkedIn Sales Navigator Key Features</h4>
<ul>
<li>Lead Recommendation suggests potential decision-makers within your target companies, while Saved Leads and Alerts track decision-makers' LinkedIn activities.</li>
<li>InMail Messaging enables direct outreach to decision-makers, even if they're not in your immediate LinkedIn network.</li>
</ul>
<h4 id="linkedin-sales-navigator-pros">LinkedIn Sales Navigator Pros</h4>
<ul>
<li>Allows fetching real-time data and enriching your platform.</li>
<li>Supports data syncing of newly fetched data with your existing customer information.</li>
<li>Advanced search options with numerous field filters.</li>
</ul>
<h4 id="linkedin-sales-navigator-cons">LinkedIn Sales Navigator Cons</h4>
<ul>
<li>Lengthy approval process, hard to get access.</li>
<li>Harsh rate limits of 1,000 profile exports per day.</li>
<li>Expensive venture, need an active subscription to access.</li>
</ul>
<h4 id="linkedin-sales-navigator-pricing">LinkedIn Sales Navigator Pricing</h4>
<p>Pricing for the API is not publicly disclosed and requires direct negotiation with LinkedIn, depending on the intended use case and volume of data access. The most common pricing reference you can get online is $99/person/mo.</p>
<h3 id="13-leadspace">13. <a href="https://www.leadspace.com/?ref=nubela.co">Leadspace</a></h3>
<p>Unique to most tools in the list, Leadspace is not a database, but a real-time lead research engine that provides targeted lead data on-demand. Its AI-driven audience modeling goes beyond basic enrichment by helping you create detailed ideal customer profiles, ICPs. This allows you to target companies that are the best fit for your goals with greater precision.</p>
<p>Additionally, Leadspace supports integration with CRMs and marketing platforms like Salesforce, HubSpot, and Marketo.</p>
<h4 id="leadspace-key-features">Leadspace Key Features</h4>
<ul>
<li>Intent Scoring searches for companies researching solutions in your industry, and helps prioritize leads.</li>
<li>Data Matching and Deduplication clears your CRM of duplicate or outdated entries.</li>
<li>Offers AI-powered audience modeling for better ICP creation and targeting.</li>
<li>Provides segmentation tools to refine company data for specific campaigns.</li>
</ul>
<h4 id="leadspace-pros">Leadspace Pros</h4>
<ul>
<li>AI-driven insights help target companies more effectively.</li>
<li>Strong focus on creating precise audience profiles.</li>
</ul>
<h4 id="leadspace-cons">Leadspace Cons</h4>
<ul>
<li>Advanced features may be overwhelming for smaller teams.</li>
<li>High-end price points.</li>
</ul>
<h4 id="leadspace-pricing">Leadspace Pricing</h4>
<p>Their pricing information is not public. You will have to contact their sales team to get a quote.</p>
<h3 id="14-owler">14. <a href="https://corp.owler.com/?ref=nubela.co">Owler</a></h3>
<p>One of the largest crowdsourced company data enrichment providers, Owler pulls insights from its active user community of over 5 million professionals, giving it a fresh, up-to-date perspective on smaller or emerging companies that might be underrepresented in other databases. The data is later verified by Owler's data science team, so you can be assured they're accurate.</p>
<p>Owler is a great choice if you need to understand not just a company but its position in the market, including competitors, estimated revenue, and leadership details. This data is aggregated from its own analytics, user contributions, and public sources, so you get an idea of how a company fits into its industry landscape.</p>
<h4 id="owler-key-features">Owler Key Features</h4>
<ul>
<li>Daily Snapshot email allows users to receive daily updates on companies of interest.</li>
<li>Crowdsourced data from over 5 million business professionals.</li>
<li>Provides competitive analysis for understanding market positioning.</li>
<li>Includes notification features for tracking changes in key companies.</li>
<li>Supports integration with popular tools like HubSpot, Salesforce, Slack and Microsoft Teams.</li>
</ul>
<h4 id="owler-pros">Owler Pros</h4>
<ul>
<li>First-hand data, crowdsourced by professionals, gives real-time updates.</li>
<li>Excellent for tracking competitors and market trends.</li>
</ul>
<h4 id="owler-cons">Owler Cons</h4>
<ul>
<li>Smaller database size of only 15 million profiles in comparison to other tools.</li>
<li>Crowdsourced data can be less reliable even with verification by the data science team.</li>
</ul>
<h4 id="owler-pricing">Owler Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free Plan Available ✅  Follow up to 5 companies  Access 1 company profile per month</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$39/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom usage and pricing</td>
</tr>
</tbody>
</table>
<h2 id="how-to-find-the-perfect-data-enrichment-tool">How to Find the Perfect Data Enrichment Tool</h2>
<p>Now that you know the top company data enrichment tools going into 2026, it's time to pick one. But how do you find the one that's best suited for your needs? Let's find out.</p>
<h3 id="1-data-needs-evaluation">1. Data needs evaluation</h3>
<p>Ask yourself these specific data-related questions:</p>
<ul>
<li><strong>What are the important data points and geographical areas you are focused on?</strong></li>
</ul>
<p>Not all company data enrichment providers are made equal. Some provide more data points than others. Circle out your must-have data points.</p>
<p>Similarly, most providers give higher emphasis toward the North American region, as they have more customers there. Be on the lookout for what geographical data you want and find a provider that covers that area.</p>
<p>NinjaPear and Adapt.io do well on data point variety, while Cognism offers wider European coverage.</p>
<ul>
<li><strong>What is your relevant industry?</strong></li>
</ul>
<p>Do you operate in a common industry or a niche? Go for a provider that is comprehensive with their datasets, and doesn't leave out your niche industry.</p>
<p>Adapt.io provides niche segmentation, while Owler might have newer, underrepresented data than other databases.</p>
<ul>
<li><strong>Does the data provider complement your outreach methods?</strong></li>
</ul>
<p>If the outreach norm in your industry is through email, then search for a provider that specializes in email enrichment. If you operate through different channels, go for a provider that supports all your channels.</p>
<p>NinjaPear's API-first design, plus spreadsheet and AI workflows, allows you to integrate enrichment capabilities into your existing workflows, applications, or platforms.</p>
<ul>
<li><strong>Are you a high-volume user?</strong></li>
</ul>
<p>Often, rate limits are imposed on enrichment platforms to push users toward subscribing for a better, more expensive plan. Choose a company data enrichment provider that accommodates your volume requirements without coercing you to pay more.</p>
<ul>
<li><strong>What current CRM and other integrations are you currently working with?</strong></li>
</ul>
<p>Learn what integrations the platform supports before you sign up for a provider. You don't want two incompatible platforms and double your workload.</p>
<p>While most company data enrichment tools on this list integrate with popular CRM platforms, your tech stack as a whole might be an issue.</p>
<ul>
<li><strong>Any add-ons you wish from your provider?</strong></li>
</ul>
<p>Besides the primary data enrichment function, most providers give some extras to differentiate themselves from the competition. Browse tools offering that something extra which would benefit you the most.</p>
<h3 id="2-data-accuracy">2. Data accuracy</h3>
<p>The worst deal you could get out of your data enrichment provider is inaccurate data. From outdated data to wrongly verified contact information, there are many things that can be wrong with the data you receive.</p>
<p>Fact-check a provider's data quality and accuracy claims through customer review sites. Better yet, go with a provider that gives you either a freshness guarantee, a transparent update cadence, or direct evidence of where the data came from.</p>
<h3 id="3-budget">3. Budget</h3>
<p>Even the perfect company data enrichment provider is just sour grapes if the cost is outlandish. There are a lot of options and pricing tiers in the market catering to varying budgets, so don't worry if you have a limited budget.</p>
<p>At the low end, Datanyze starts at $29/mo and Owler at $39/mo. Adapt.io starts at $49/mo. NinjaPear, meanwhile, uses pay-as-you-go pricing with no monthly minimums, which I think is a better fit for teams that hate shelfware.</p>
<h3 id="4-legal-compliance">4. Legal compliance</h3>
<p>Consider going with a provider that sources data legally and ethically. GDPR and CCPA compliance are the norm in the data industry.</p>
<p>Almost all company data enrichment tool providers in my list claim some form of compliance posture. However, be sure to do your due diligence for complete peace of mind.</p>
<h3 id="5-customer-support">5. Customer support</h3>
<p>Isn't it great when you reach out to customer support and they get back to you two days later? Absolutely not. Some promise 24/7 customer support but all you get is chatbots in return. Look for a provider that has a human listening to your concerns at the other end and not AI.</p>
<p>This matters more than buyers admit. When enrichment breaks, routing breaks. When routing breaks, revenue ops gets dragged into a preventable mess.</p>
<h2 id="my-take">My take</h2>
<p>If you want a legacy name in this market, the old Proxycurl section is here for historical context. But Proxycurl is sunset, and that matters.</p>
<p>If you are choosing a data enrichment tool in 2026, I'd start with NinjaPear if your use case is broader than simple record append. That is especially true if you care about company context, customer relationships, monitoring changes, and using the data inside workflows instead of just exporting a CSV and calling it a day.</p>
<p>If you only want plain enrichment inside an existing HubSpot motion, Clearbit still makes sense. If you're a large US-heavy sales org, ZoomInfo is still on the shortlist. If Europe matters, Cognism earns its place. If budget matters more than breadth, UpLead and Adapt.io are still worth a look.</p>
<p>That's the actual decision tree. Not the fake one most listicles give you.</p>
<p>If you want to test a modern alternative built by the founder behind Proxycurl, try NinjaPear's free trial and run a few real companies through it. Do it with accounts you already know well. You'll figure out very quickly whether you need another database, or whether you need a better map.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Crunchbase API: A Guide on Everything You Need to Know ]]></title>
        <description><![CDATA[ Find everything you need to know about Crunchbase API, with a working demo and code snippet. Get access to all the Crunchbase data you want. ]]></description>
        <link>https://nubela.co/blog/crunchbase-api-guide/</link>
        <guid isPermaLink="false">673ff2731cb59d0001b17e75</guid>
        <category><![CDATA[ crunchbase ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Wed, 18 Dec 2024 13:14:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_427-2.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<div style="background:#fff7ed;border:1px solid #fdba74;border-left:5px solid #f97316;border-radius:10px;padding:16px 18px;margin:0 0 28px 0;">
  <div style="font-weight:700;color:#9a3412;font-size:15px;margin-bottom:6px;">Updated for 2026</div>
  <div style="color:#7c2d12;font-size:15px;line-height:1.55;">This article has been revised. If you want the latest version, read the <a href="https://nubela.co/blog/crunchbase-api/" style="color:#c2410c;font-weight:600;text-decoration:none;">new Crunchbase API Guide for 2026</a>.</div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Given <a href="https://www.crunchbase.com/?ref=nubela.co">Crunchbase's</a> plethora of company information, it would be a waste not to make the most of it. Thankfully, Crunchbase has its own API that allows you to access and integrate the website's data into your applications, everything from company profiles, funding histories, market trends, and competitive landscapes.</p>
<p>A Reddit user put the tradeoff pretty plainly:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/datasets</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/hugebigfatrhino</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Otherwise, if you get API access, you can basically get all their data. They don’t track usage but will rate-limit you. In general they seem to be pretty friendly about it if you’re a paying customer. Quality seems pretty decent, but given the nature of private companies, there no perfect data source.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/datasets/comments/974c07/crunchbase_access_options_value_data_quality/e469yu2/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>But how do you access it? What does it cost? Is it worth it?</p>
<p>Welcome to the only Crunchbase API guide you will ever need. In this article, I will explore all Crunchbase API packages, discuss their features, show you a demo on how to access those APIs, and the costs associated with each. We'll end on a high note by comparing Crunchbase API with alternative solutions, including the now-sunset Proxycurl and <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, the platform its founder is building now.</p>
<p>Sounds fair? Let's begin.</p>
<h2 id="crunchbase-api-packages">Crunchbase API Packages</h2>
<p>Crunchbase offers tailored API packages, four tiers of data access in exact. You have the freedom to choose between these packages depending on your application or use case.</p>
<h3 id="tier-1-firmographics">Tier 1: Firmographics</h3>
<p>Firmographic data <strong><em>outlines business characteristics</em></strong>, similar to how demographics outline the characteristics of individuals. The contents include industry type, company size, revenue, location, organizational structure and more. The purpose is to give you a full picture of a company’s role and position in the market.</p>
<p><strong>Key Features</strong></p>
<ul>
<li>Company name, type, and legal status.</li>
<li>Industry classification and organizational structure.</li>
<li>Revenue and employee size.</li>
<li>Geographic location and operational reach.</li>
</ul>
<p><strong>Ideal For</strong></p>
<ul>
<li><strong>Sales Teams</strong>: Discover qualified leads based on industry, size, and geography to streamline outreach.</li>
<li><strong>Market Analysts</strong>: Enrich market research with detailed company profiles for competitive analysis.</li>
<li><strong>Risk Management Team</strong>: Mitigate partnership risks by verifying business legitimacy and foundational data.</li>
<li><strong>Business Developers</strong>: Evaluate competitors or partners with comprehensive organizational insights.</li>
</ul>
<h3 id="tier-2-basic-financials">Tier 2: Basic Financials</h3>
<p>Peek into company with the Basic Financials Package. A brief overview of financial metrics that <strong><em>look into a company's financial health</em></strong> and assist you in making informed investment decisions.</p>
<p><strong>Features</strong></p>
<ul>
<li>Basic financial metrics overview.</li>
<li>Investment insights, including funding rounds and investor profiles.</li>
</ul>
<p><strong>Perfect For</strong></p>
<ul>
<li><strong>Financial Analysts:</strong> Develop in-depth reports and accurate financial forecasts.</li>
<li><strong>Investors:</strong> Screen and evaluate potential investment opportunities with comprehensive data on funding trends.</li>
</ul>
<h3 id="tier-3-advanced-financials">Tier 3: Advanced Financials</h3>
<p>Perfect for those needing a <strong><em>granular analysis of detailed funding histories and complex financial health indicators</em></strong>. With details on funding histories, complex financial trends, and key financial metrics, it supports strategic decisions at the highest levels.</p>
<p><strong>Features</strong></p>
<ul>
<li>Exhaustive financial metrics, including funding histories and long-term trends.</li>
<li>Advanced investment analysis tools for in-depth forecasting.</li>
</ul>
<p><strong>Perfect For</strong></p>
<ul>
<li><strong>Market Analysts:</strong> Conduct market and competitor evaluation for strategic planning or mergers, acquisitions and major investments.</li>
</ul>
<h3 id="tier-4-predictions-and-insights">Tier 4: Predictions and Insights</h3>
<p>Complete Crunchbase unlocked! The Predictions and Insights package is a game-changer for businesses looking to stay ahead of the curve. You get <strong><em>real-time signals on critical events</em></strong> like layoffs, executive changes, or growth trends, for accurate decision-making.</p>
<p><strong>Features</strong></p>
<ul>
<li>Advanced insights and real-time signals, including funding predictions and news analytics.</li>
<li>Predictive analytics for employee changes, product launches, and company performance.</li>
</ul>
<p><strong>Use Cases</strong></p>
<ul>
<li><strong>Investors:</strong> Venture capitalists and private equity firms use predictive data to identify promising startups and emerging companies.</li>
<li><strong>Sales Teams:</strong> Optimize outreach by targeting high-potential leads and businesses poised for growth.</li>
<li><strong>Recruiters:</strong> Spot scaling companies that are expanding and likely to hire executive talent.</li>
</ul>
<h2 id="how-to-access-crunchbase-apis">How to Access Crunchbase APIs</h2>
<p>The <strong>Basic API</strong> will give you access to firmographic data points like organization description, address, etc. You get access as soon as you register an account with Crunchbase through <a href="https://www.crunchbase.com/account?ref=nubela.co">account settings</a>.</p>
<p>Unregistered users can <a href="https://www.crunchbase.com/register?ref=nubela.co">sign up for Crunchbase basic access</a>. You get immediate access to an API key and can get started with exploring Crunchbase's Basic data as soon as the API key is activated, which typically takes 15 minutes to an hour.</p>
<p>One important update, because this changed and a lot of older blog posts still get it wrong: Crunchbase's own docs now state that they are <strong>no longer offering the Basic API</strong> to new users. If you already generated a Basic API key, you may still be able to view it, but you can no longer regenerate a new one.</p>
<p><img alt="Crunchbase Basic docs showing that the Basic API is no longer offered" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/d707c52afa56.webp" /></p>
<p>Crunchbase also has a robust API documentation at <a href="https://data.crunchbase.com/docs/crunchbase-basic-getting-started?ref=nubela.co">Crunchbase Basic docs</a> if you need assistance. In case you are still not sure on the data fields you can access with the Basic Plan, check out <a href="https://data.crunchbase.com/docs/organizationsummary?ref=nubela.co">Organization Attributes for Basic API</a> for further clarification.</p>
<p>The <strong>Crunchbase Full API</strong> (currently v4.0) provides exclusive Crunchbase data, such as advanced firmographics, advanced financials, company insights, and more. For full API access, you will have to contact Crunchbase's sales team.</p>
<h3 id="demo-using-entity-lookup-api">Demo Using Entity Lookup API</h3>
<p>The Crunchbase API uses token-based authentication, which means that developers must pass their individual API Key parameter with every request.</p>
<p>The Entity Lookup API endpoints are provided so you can retrieve data, data fields and relationships from a specific entity. Crunchbase provides Entity Lookup endpoints for organizations, people, funding rounds, and acquisitions.</p>
<p>To make a request using the Entity Lookup APIs, you must provide the following:</p>
<ul>
<li>a user key</li>
<li>an <code>{entity_id}</code> , which can either be the UUID or the permalink (e.g., <code>tesla-motors</code>) of the entity</li>
</ul>
<p>You can also ask for additional data fields and relationships in the response by adding the <code>field_ids</code> and/or <code>card_ids</code> parameters to the request. Here is an example below:</p>
<pre><code class="language-http">GET https://api.crunchbase.com/v4/data/entities/organizations/tesla-motors?card_ids=founders,raised_funding_rounds&amp;field_ids=categories,short_description,rank_org_company,founded_on,website,facebook,created_at&amp;user_key=INSERT_KEY_HERE
</code></pre>
<h3 id="example-entity-lookup-request">Example Entity Lookup Request</h3>
<p>Entity Lookup API is one of the APIs Crunchbase provides where you can pull up information from a specific entity.</p>
<p><img alt="Crunchbase documentation page for the Entity Lookup API example request" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/ab83bfeb4334.webp" /></p>
<p>Here's an example request using <a href="https://data.crunchbase.com/docs/using-entity-lookup-apis?ref=nubela.co">Entity Lookup API</a>. Let's try and pull company information of Tesla Motors.</p>
<pre><code class="language-http">GET https://api.crunchbase.com/v4/data/entities/organizations/tesla-motors?card_ids=founders,raised_funding_rounds&amp;field_ids=categories,short_description,rank_org_company,founded_on,website,facebook,created_at&amp;user_key=INSERT_KEY_HERE
</code></pre>
<p>And here's the response it generates:</p>
<pre><code class="language-json">{
  &quot;properties&quot;: {
    &quot;identifier&quot;: {
      &quot;uuid&quot;: &quot;a367b036-5952-5435-7541-ad7ee8869e24&quot;,
      &quot;value&quot;: &quot;Tesla&quot;,
      &quot;image_id&quot;: &quot;dj8rndg9wkqkpgvplvzi&quot;,
      &quot;permalink&quot;: &quot;tesla-motors&quot;,
      &quot;entity_def_id&quot;: &quot;organization&quot;
    },
    &quot;short_description&quot;: &quot;Tesla Motors is an electric vehicle and clean energy company that provides electric cars, solar, and renewable energy solutions.&quot;,
    &quot;facebook&quot;: {
      &quot;value&quot;: &quot;https://www.facebook.com/TeslaMotorsCorp&quot;
    },
    &quot;created_at&quot;: &quot;2007-12-24T13:25:13Z&quot;,
    &quot;rank_org_company&quot;: 2978
  }
}
</code></pre>
<p>Crunchbase documentation is pretty solid. If you find yourself in a tight corners, you can check out Crunchbase documentation at <a href="https://data.crunchbase.com/docs/using-the-api?ref=nubela.co">Using the API</a> tab for your assistance.</p>
<h2 id="full-crunchbase-plans-and-api-options">Full Crunchbase Plans and API Options</h2>
<p>Crunchbase has several subscription and API access plans, so it can get a bit confusing. Let me break it down in the simplest way possible.</p>
<h3 id="subscription-plans">Subscription Plans</h3>
<p>The overall access tiers for using Crunchbase’s services. This is what you'll find on their pricing page. Each tier unlocks different levels of data and features:</p>
<ul>
<li><strong>Pro Plan</strong>: Access to private company data, investor profiles, and growth signals.</li>
<li><strong>Business Plan</strong>: For teams that need exports, CRM integrations, contact data, and support.</li>
<li>
<p><strong>API Plan</strong>: Designed for larger teams or companies with the most comprehensive access to data, bulk exports, and API integration. Within the API plan, Crunchbase offers specific data packages that cater to different needs <a href="https://nubela.co/blog/crunchbase-api-guide">(what I talked about earlier)</a>:</p>
</li>
<li>
<p><strong>Firmographics</strong>: Company data including size, location, and industry.</p>
</li>
<li><strong>Basic Financials</strong>: Surficial financial data like funding rounds.</li>
<li><strong>Advanced Financials</strong>: Detailed financial data, including revenue estimates and valuation.</li>
<li><strong>Predictions and Insights</strong>: The most comprehensive package, with advanced insights and real-time signals on companies.</li>
</ul>
<h3 id="api-access">API Access</h3>
<p>API access tiers allows you to integrate Crunchbase data into your systems based on your requirements. There are two main API packages:</p>
<ol>
<li><strong>Basic API:</strong> Limited access to datasets and usage quotas.</li>
<li><strong>Full API:</strong> Full access to Crunchbase's datasets, granular information and higher usage limits. See <a href="https://support.crunchbase.com/hc/en-us/articles/30598109284883-What-is-the-difference-between-the-Crunchbase-Basic-API-vs-Full-API?ref=nubela.co">What is the difference between the Crunchbase Basic API vs Full API?</a></li>
</ol>
<p>Your <strong>Subscription Plan</strong> (Pro, Business or API) determines your level of access to Crunchbase’s data. You can select between the <strong>Basic or Full API</strong> to further enhance that access depending on your use case. Furthermore, you can focus on <strong>specific types of data</strong> under the API Plan through the Firmographics, Basic Financials, Advanced Financials, or Predictions and Insights data packages.</p>
<h2 id="crunchbase-pricing">Crunchbase Pricing</h2>
<p>Here's an overview of the plans and pricing Crunchbase offers, with their subsequent features.</p>
<table>
<thead>
<tr>
<th>Subscription Plan</th>
<th>Price</th>
<th>Features</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pro Plan</td>
<td><strong>$49</strong>/mo billed annually OR <strong>$99</strong>/mo billed monthly</td>
<td>4M+ private companies with all company and investor profile data, including growth signals and AI-powered insights</td>
</tr>
<tr>
<td>Business Plan</td>
<td>Starting at <strong>$199</strong>/mo billed annually</td>
<td>Everything in Pro, plus 5k exports per month, contact data, CRM integrations, auto-enrichment add-ons, and customer success support</td>
</tr>
<tr>
<td>API Plan</td>
<td>Custom usage and pricing</td>
<td>Proprietary company intelligence, live company data at scale, 200 calls/min, predictions and insights, plus bulk export API data via CSV</td>
</tr>
</tbody>
</table>
<p>That pricing split is the part most people miss. Crunchbase sells a research product and an API product, and the overlap is not clean. I have seen teams assume Pro automatically means meaningful API access. It does not.</p>
<p>I tried to pull a live pricing screenshot for this update, but Crunchbase's pricing page is currently gated behind session verification in-browser. I am leaving the verified pricing table here and not forcing in a broken image. Better no image than a dead one.</p>
<h2 id="crunchbase-api-limitations">Crunchbase API Limitations</h2>
<p>Crunchbase API is not without its flaws. Keep in mind their product limitations are your usage limitations so think of this like a heads up.</p>
<ol>
<li><strong>Rate Limits</strong>: Crunchbase has a rate limit of <strong>200 calls per minute</strong> for their API endpoints. They claim it as a wall to protect the platform and ensure consistent reliability and performance. It could be limiting for corporations that work with bulk data.</li>
<li><strong>Export Limits</strong>: If you're subscribed to Crunchbase Pro, you can see full search results, but cannot export them. Crunchbase Business subscribers are also limited to <strong>5K rows of exports per month</strong>.</li>
<li><strong>Inaccurate Information:</strong> Crunchbase relies on self-reported information from various sources, which may not always be accurate or up-to-date. Additionally, information is volatile in the business world, making it difficult for any database to maintain a completely accurate record.</li>
<li><strong>Costly at Scale</strong>: While basic access is free, higher usage or premium features come with significant costs, making it hard for startups and small businesses to consider Crunchbase API as an option.</li>
<li><strong>Attribution Requirements</strong>: Usually, people pay premium money to get rid of an annoying watermark. However, with Crunchbase, the licensees must attribute content sourced when made available or visible to any third party. Attribution must state <code>Powered by Crunchbase</code> and be accompanied by a hyperlink to Crunchbase.</li>
</ol>
<p>Another Reddit comment said the quiet part out loud:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SideProject</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Perl-starr</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">That’s a solid build-Crunchbase’s API can be limiting and expensive. When I needed access to company data for a client tool, I ended up combining a custom Airtable stack with UpLead for lead enrichment. Not as slick as a fully integrated API, but it was lean and fast to get going.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SideProject/comments/10a14hz/i_developed_an_api_to_fetch_data_from_crunchbase/mygl5x9/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If your business depends on accurate and reliable data, you should not pull any stops while choosing your provider. With so many limitations, it really makes you reconsider your standing on Crunchbase API. But you're not out of options just yet.</p>
<h2 id="enter-proxycurl">Enter Proxycurl</h2>
<blockquote>
<p><strong>Update:</strong> Proxycurl has been sunset. I am retaining this section because the original comparison is still useful context, but the founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which I cover right after this section.</p>
</blockquote>
<p><a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> was a paid API that focused on people and company enrichment from sources like LinkedIn and Crunchbase. Real-time scraping to <a href="https://nubela.co/blog/historical-employee-growth-with-employee-count-endpoint/">historical data</a>, it had a wide range of enrichment use cases. The biggest reason people used it was that it was designed to fit into existing systems and workflows.</p>
<p>I do admit that Proxycurl was a platform designed for developers. But you didn't need rocket science or expert technical proficiency to figure out how it worked. In fact, let me show you how easy it was to pull fresh company data using the Company Profile Endpoint.</p>
<h3 id="demo-using-proxycurl-company-profile-endpoint">Demo Using Proxycurl Company Profile Endpoint</h3>
<p>Start off by creating a free account with Proxycurl. You got free credits upon signup so you didn't need to pay right away. Head on to your dashboard and get a unique API key. You needed this key for authentication.</p>
<p>Using the Company Profile Endpoint, let’s try and pull up information about Tesla Motors like we did with Crunchbase API.</p>
<p>The Proxycurl Company Profile API endpoint was:</p>
<pre><code class="language-http">https://api.proxycurl.com/v2/company/profile
</code></pre>
<p>Your API key should be included as a header:
<code>Authorization: Bearer YOUR_API_KEY</code></p>
<p>To search for Tesla Motors, the parameter <code>url</code> could be used to pass Tesla's LinkedIn URL:</p>
<pre><code class="language-json">{
  &quot;url&quot;: &quot;https://www.linkedin.com/company/tesla-motors/&quot;
}
</code></pre>
<h3 id="example-request-and-response">Example Request and Response</h3>
<p>Here's what your full request looked like in Python.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;YOUR_API_KEY&quot;
URL = &quot;https://api.proxycurl.com/v2/company&quot;

payload = {
    &quot;url&quot;: &quot;https://www.linkedin.com/company/tesla-motors/&quot;
}

headers = {
    &quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;
}

response = requests.get(URL, headers=headers, params=payload)

if response.status_code == 200:
    data = response.json()
    print(&quot;Company Name:&quot;, data.get(&quot;name&quot;))
    print(&quot;Website:&quot;, data.get(&quot;website&quot;))
    print(&quot;Headquarters:&quot;, data.get(&quot;headquarters_location&quot;))
    print(&quot;Industry:&quot;, data.get(&quot;industry&quot;))
    print(&quot;Employee Count:&quot;, data.get(&quot;employee_count&quot;))
else:
    print(&quot;Error:&quot;, response.status_code, response.text)
</code></pre>
<p>What you got was a JSON response with Tesla’s details.</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Tesla Motors&quot;,
  &quot;website&quot;: &quot;https://www.tesla.com&quot;,
  &quot;industry&quot;: &quot;Automotive&quot;,
  &quot;headquarters_location&quot;: &quot;Palo Alto, California, United States&quot;,
  &quot;employee_count&quot;: 10000,
  &quot;founded_year&quot;: 2003,
  &quot;linkedin_url&quot;: &quot;https://www.linkedin.com/company/tesla-motors/&quot;,
  &quot;description&quot;: &quot;Tesla, Inc. is an American electric vehicle and clean energy company ...&quot;
}
</code></pre>
<p>Depending on what data fields you needed, you could add or remove them. It was that easy.</p>
<h2 id="ninjapear-as-the-modern-alternative">NinjaPear as the modern alternative</h2>
<p>If you're reading this in 2026 and you landed here because you need an actual alternative, this is the part that matters.</p>
<p>Proxycurl is gone. The founder behind it is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, and the product direction is different. Less "mirror LinkedIn" energy, more competitive intelligence plus enrichment from public web data.</p>
<p>The pitch is simple:</p>
<ul>
<li>company profile data</li>
<li>person profile enrichment</li>
<li>employee count</li>
<li>work email lookup</li>
<li>customer intelligence</li>
<li>competitor monitoring</li>
</ul>
<p>That last part is why I think NinjaPear belongs in this article. Crunchbase is strong when your world revolves around firms, funding, and investor-style research. NinjaPear is stronger when your world revolves around GTM execution, competitive monitoring, customer discovery, and moving on live signals.</p>
<p>A good example is the <a href="https://nubela.co/companies?ref=nubela.co">Company API</a>. The product page is blunt about what it returns: industry, founders, headcount, funding, addresses, and updates. That is not identical to Crunchbase. It is a different shape of data, and for many sales or market-mapping workflows, it is the more useful shape.</p>
<p><img alt="NinjaPear company and competitive intelligence explorer" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e01f6ecb6deb.webp" /></p>
<h3 id="demo-using-ninjapear-company-api">Demo Using NinjaPear Company API</h3>
<p>The simplest way to think about NinjaPear is this: plain REST endpoints, JSON in, JSON out, pay per call.</p>
<p>Here is a basic Python example using NinjaPear's company enrichment flow.</p>
<pre><code class="language-python">import os
import requests

API_KEY = os.environ[&quot;NP_KEY&quot;]
url = &quot;https://nubela.co/api/v1/company&quot;
params = {
    &quot;website&quot;: &quot;https://tesla.com&quot;
}
headers = {
    &quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;
}

response = requests.get(url, params=params, headers=headers)
response.raise_for_status()

data = response.json()
print(data)
</code></pre>
<p>And here is the kind of JSON shape NinjaPear publicly advertises:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Stripe&quot;,
  &quot;industry&quot;: &quot;Payments&quot;,
  &quot;employee_count&quot;: 8500,
  &quot;funding_total_usd&quot;: 8700000000,
  &quot;latest_update&quot;: &quot;...&quot;
}
</code></pre>
<p>If what you actually need is not just company metadata but motion, who sells to whom, who competes with whom, and what changed this week, NinjaPear is playing a different game than Crunchbase.</p>
<h2 id="crunchbase-api-vs-proxycurl-vs-ninjapear">Crunchbase API vs Proxycurl vs NinjaPear</h2>
<p>It's time to bring these options head-to-head. Since Proxycurl has been sunset, I am keeping it here as historical context and adding NinjaPear as the current option that matters.</p>
<table>
<thead>
<tr>
<th>Metrics</th>
<th>Crunchbase API</th>
<th>Proxycurl API (sunset)</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data quality</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>Pricing</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Ease of use</td>
<td>⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>API flexibility</td>
<td>⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Freshness</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td>Best fit</td>
<td>Investor research</td>
<td>Enrichment</td>
<td>Competitive intel + enrichment</td>
</tr>
<tr>
<td>Average score</td>
<td><strong>3.17/5</strong></td>
<td><strong>4.00/5</strong></td>
<td><strong>4.50/5</strong></td>
</tr>
</tbody>
</table>
<p>Now, let's look at each of these metrics up close.</p>
<h3 id="data-collection">Data Collection</h3>
<p><strong>NinjaPear:</strong> Public web data, structured enrichment, and competitive intelligence data that goes beyond static company profiles. It is explicitly not built around scraping LinkedIn.</p>
<p><strong>Proxycurl:</strong> Proxycurl scraped publicly available data in real-time from trusted sources such as LinkedIn and Crunchbase. What you got was accurate, up-to-date information for enrichment workflows.</p>
<p><strong>Crunchbase:</strong> Crunchbase collects data from various sources, including:</p>
<ul>
<li><strong>User-Generated Content</strong>: Content and submissions from the community, basically like Wikipedia.</li>
<li><strong>Partnerships with Data Providers</strong>: Crunchbase partners with reputable data providers to augment its database. These partnerships help increase the accuracy and depth of the data.</li>
<li><strong>Web Crawling and Automated Data Collection</strong>: Crunchbase uses web crawling and automated data collection methods to gather information from public sources.</li>
</ul>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Primary Data Sources</strong></td>
<td>Public records, proprietary updates, user contributions</td>
<td>Trusted sources like LinkedIn and Crunchbase</td>
<td>Public web sources, company websites, structured competitive intelligence</td>
</tr>
<tr>
<td><strong>Data Types</strong></td>
<td>Business and financial details</td>
<td>Business and individual profiles</td>
<td>Business intelligence, updates, profiles, customer and competitor data</td>
</tr>
<tr>
<td><strong>Focus</strong></td>
<td>Funding, firmographics, and market analytics</td>
<td>Employment, people, and company profiles</td>
<td>GTM intelligence, enrichment, and monitoring</td>
</tr>
</tbody>
</table>
<h3 id="pricing">Pricing</h3>
<p><strong>NinjaPear:</strong> A 3-day free trial, 10 credits included, no credit card required, and no monthly minimums. Pay-as-you-go is the whole point.</p>
<p><strong>Proxycurl:</strong> You got free credits up front when you signed up. If you wanted more, you could choose a subscription plan or pay-as-you-go credits.</p>
<p><strong>Crunchbase:</strong> Crunchbase offers a freemium-to-sales-led model. The Basic plan is free, Pro starts at <strong>$49/mo annually</strong> or <strong>$99/mo monthly</strong>, Business starts at <strong>$199/mo annually</strong>, and API is custom.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Free Access</strong></td>
<td>Limited basic data only</td>
<td>Free credits upon signup</td>
<td>3-day free trial, 10 credits</td>
</tr>
<tr>
<td><strong>Pricing Model</strong></td>
<td>Subscription + custom API contracts</td>
<td>Subscription + credit-based</td>
<td>Pay-as-you-go, no monthly minimums</td>
</tr>
<tr>
<td><strong>Basic Paid Plan</strong></td>
<td>Pro ($49/mo annual or $99/mo monthly)</td>
<td>Starter ($49/mo, historical context)</td>
<td>Usage-based</td>
</tr>
</tbody>
</table>
<h3 id="data-freshness">Data Freshness</h3>
<p><strong>NinjaPear:</strong> Built around live company intelligence, including company changes across blogs, X posts, and website changes through <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a>.</p>
<p><strong>Proxycurl:</strong> Proxycurl provided real-time scraping, with a freshness guarantee. You had control over how fresh you wanted your data to be.</p>
<p><strong>Crunchbase:</strong> Crunchbase regularly updates datasets, but it is still not a live-monitoring product.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Update Frequency</strong></td>
<td>Periodic</td>
<td>Real-time for supported endpoints</td>
<td>Real-time monitoring + fresh enrichment</td>
</tr>
<tr>
<td><strong>Real-time Insights</strong></td>
<td>Limited</td>
<td>Better for enrichment freshness</td>
<td>Strong for org changes and company motion</td>
</tr>
</tbody>
</table>
<h3 id="rate-limits">Rate Limits</h3>
<p><strong>NinjaPear</strong>: Pay per call, API-first, no monthly minimums. The platform is clearly built for programmatic use.</p>
<p><strong>Proxycurl</strong>: Historically, Proxycurl advertised very generous throughput for high-volume users.</p>
<p><strong>Crunchbase API</strong>: Restricted to <strong>200 API requests per minute</strong>. Rate limits are based on subscription tiers. Lower tiers have stricter API call restrictions.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Rate Limit</strong></td>
<td>200 requests per minute</td>
<td>High-volume historical positioning</td>
<td>API-first usage model</td>
</tr>
<tr>
<td><strong>Scalability</strong></td>
<td>Limited by tier and contract</td>
<td>Strong for enrichment at scale</td>
<td>Strong for enrichment and monitoring workflows</td>
</tr>
</tbody>
</table>
<h3 id="customization">Customization</h3>
<p><strong>NinjaPear</strong>: You are not boxed into just one data shape. You can work through API endpoints, spreadsheets, or AI agents depending on how your team operates.</p>
<p><strong>Proxycurl</strong>: You got granular control over API requests and could tailor data fields according to your needs.</p>
<p><strong>Crunchbase API</strong>: Offers predefined data packages that limit customization to the provided dataset categories. You have to work within these constraints.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Data Structure</strong></td>
<td>Predefined packages</td>
<td>Granular data fields</td>
<td>Multiple product surfaces + API</td>
</tr>
<tr>
<td><strong>Adaptability</strong></td>
<td>Limited to standard business tools</td>
<td>Flexible for bespoke applications</td>
<td>Flexible for GTM, research, and agent workflows</td>
</tr>
<tr>
<td><strong>Developer Control</strong></td>
<td>Fixed endpoints and data outputs</td>
<td>Fine-tuned API responses</td>
<td>Plain REST endpoints, JSON in / JSON out</td>
</tr>
</tbody>
</table>
<h3 id="best-for">Best For</h3>
<p><strong>NinjaPear:</strong> Sales teams, competitive intelligence teams, investors tracking portfolio motion, and anyone who wants to know not just what a company is, but what it is doing.</p>
<p><strong>Proxycurl:</strong> If there was one thing Proxycurl did best, it was enriching people and company data. It was ideal for recruitment, lead generation, and CRM enhancements.</p>
<p><strong>Crunchbase API:</strong> Crunchbase is more geared toward research than anything else. It empowers venture capitalists, sales teams, and analysts with detailed insights into company financials, funding histories, and market trends.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Focus</strong></td>
<td>Investment and financial insights</td>
<td>LinkedIn-based people and company data</td>
<td>Competitive intelligence and enrichment</td>
</tr>
<tr>
<td><strong>Primary Data</strong></td>
<td>Firmographics, funding, financials</td>
<td>Company and individual profiles</td>
<td>Customers, competitors, updates, profiles</td>
</tr>
<tr>
<td><strong>Best For</strong></td>
<td>Investors, analysts, strategists</td>
<td>Sales teams, marketers, recruiters</td>
<td>GTM teams, revops, founders, analysts</td>
</tr>
<tr>
<td><strong>Use Cases</strong></td>
<td>Market intelligence, due diligence</td>
<td>CRM enrichment, lead generation</td>
<td>Account monitoring, prospecting, market mapping</td>
</tr>
</tbody>
</table>
<h3 id="legal-compliance">Legal Compliance</h3>
<p><strong>NinjaPear:</strong> The public positioning is clear: publicly sourced data, no scraping behind login walls, and no dependency on LinkedIn.</p>
<p><strong>Proxycurl:</strong> Proxycurl positioned itself as GDPR and CCPA compliant.</p>
<p><strong>Crunchbase:</strong> Matching stride here, Crunchbase is also GDPR and CCPA compliant.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Crunchbase API</th>
<th>Proxycurl API</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>GDPR</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>CCPA</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
</tbody>
</table>
<h2 id="the-bottomline">The Bottomline</h2>
<p>Crunchbase API is certainly a viable option if you're looking to harvest Crunchbase's data. If your use case is centered on startup research, funding history, investor discovery, and company lookups, it still does the job.</p>
<p>But the original version of this article ended with Proxycurl, and time moved on. Proxycurl has been sunset. The more relevant update is this: if what you need is live GTM intelligence, public-web company enrichment, customer discovery, competitive monitoring, or API-first workflows without getting dragged into enterprise-sales theater too early, look at NinjaPear.</p>
<p>I would put it this way.</p>
<ul>
<li>Choose <strong>Crunchbase API</strong> if you want Crunchbase's proprietary dataset.</li>
<li>Choose <strong>NinjaPear</strong> if you want fresher company motion, competitive intelligence, and enrichment built for operators.</li>
<li>Read the old <strong>Proxycurl</strong> section as historical context, not as a buying recommendation.</li>
</ul>
<p>If you already know your workflow depends on company changes, customer intelligence, or fast enrichment, go try NinjaPear's 3-day free trial and make a few calls yourself. That is still the fastest way to tell if the data fits your stack.</p>
<h4 id="is-crunchbase-api-free">Is Crunchbase API free?</h4>
<p>You get basic access when you register an account with Crunchbase. That is the historical answer. The current answer is trickier: Crunchbase's docs now say they are <strong>no longer offering the Basic API</strong> to new users, though existing generated keys may still be viewable.</p>
<h4 id="what-are-the-limitations-of-crunchbase-api">What are the limitations of Crunchbase API?</h4>
<p>There is a rate limit of <strong>200 calls per minute</strong> for Crunchbase API. Crunchbase Business users are also limited to <strong>5,000 export rows per month</strong>, and deeper API access moves into custom pricing.</p>
<h4 id="how-to-get-data-from-crunchbase">How to get data from Crunchbase?</h4>
<p>First, locate your unique user key from your Crunchbase account. Then make requests to the relevant API endpoint and include the <code>user_key</code> parameter. For exports, Crunchbase can also provide downloadable CSV workflows depending on your plan.</p>
<h4 id="is-it-legal-to-scrape-crunchbase">Is it legal to scrape Crunchbase?</h4>
<p>Legality depends on jurisdiction, contract terms, and how the data is accessed or republished. If you are making a business decision here, talk to counsel and read Crunchbase's terms. Do not treat a blog post, including this one, as legal advice.</p>
<h4 id="how-do-i-export-from-crunchbase-to-excel">How do I export from Crunchbase to Excel?</h4>
<p>Build a search or create a list, then click the <strong>Export To CSV</strong> button in the upper right-hand corner if your plan allows it. The downloaded file can be opened with Excel, Google Sheets, OpenOffice, or another spreadsheet tool of your choice.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How T-Shirts Reflect Corporate Culture: 11 Creative Designs Ideas ]]></title>
        <description><![CDATA[ 11 best corporate tshirt design ideas. 1. Minimalist Logo T-shirt 2. Taglines 3. Inside Jokes 4. Diverse and Inclusive T-shirts 5. Sustainably sourced T-shirts ]]></description>
        <link>https://nubela.co/blog/how-t-shirts-reflect-corporate-culture-creative-designs-ideas/</link>
        <guid isPermaLink="false">67523526b4546d00014e83fa</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Tue, 17 Dec 2024 08:28:07 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_426.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Ahrefs Evolve 2024, held over two days in Singapore, brought together over 500 professionals to network and share insights into the future of digital marketing. Team Proxycurl was also there, to learn and connect with industry peers.</p>
<blockquote>
<p><strong>Quick note:</strong> Proxycurl API has since been sunset. The founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, a new B2B data platform. I’ve kept the original Proxycurl references in this piece because they are part of the story and the t-shirts themselves.</p>
</blockquote>
<p>Amid all the networking, one unexpected star emerged: our company t-shirt.</p>
<p><img alt="Picture of Proxycurl employees at Ahrefs Evolve 2024 in Singapore" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/image--1-.jpg" /></p>
<p>Team Proxycurl at the Ahrefs Evolve 2024 Event in Singapore</p>
<p>Again and again, we heard, “I love your t-shirt.”</p>
<p>“Thanks! It’s our company t-shirt. We designed it ourselves.”</p>
<p>“Looks great. It must be fun working at your company.”</p>
<p>What started as casual compliments turned into meaningful discussions, with the t-shirt acting as an icebreaker. It wasn’t planned, but the design sparked curiosity and gave us an opportunity to share a bit about Proxycurl.</p>
<p>On the trip back, I couldn’t help but wonder, <strong><em>how much does a t-shirt really say about a company’s culture?</em></strong></p>
<h2 id="what-corporate-culture-looks-like-today">What Corporate Culture Looks Like Today</h2>
<p>How often do you hear a company say, <em>“We’re a fun place to work!”</em>?</p>
<p>And how often do you actually believe it?</p>
<p>I’ve been in enough job interviews to know the drill. When it’s my turn to ask questions, I always inquire about company culture (Yes, I did that in my interview with Proxycurl too). What I usually get back is a well-rehearsed monologue about how “great” it is to work there. I’m left unconvinced.</p>
<p>Corporate culture is the actions, atmosphere, and values you can see, feel, and experience. As an employee, the job isn’t just a paycheck; it’s where we spend most of our waking hours. If the culture doesn’t inspire confidence, it’s better to keep looking. I go back to how Chris Voss puts it in <em>Never Split the Difference</em>, <em>“No deal is better than a bad deal.”</em></p>
<p>The game has truly changed. It’s no longer about keeping things in-house. Now, it’s all about making your business everyone else’s business.</p>
<p>Take this TikTok for instance.</p>
<blockquote>
<p><a href="https://www.tiktok.com/@futurecloudacc?refer=embed&ref=nubela.co" title="@futurecloudacc">@futurecloudacc</a></p>
<p>This is how we introduce the newest members of the team!😂 all in the second take aswell! <a href="https://www.tiktok.com/tag/fyp?refer=embed&ref=nubela.co" title="fyp">#fyp</a> <a href="https://www.tiktok.com/tag/team?refer=embed&ref=nubela.co" title="team">#team</a> <a href="https://www.tiktok.com/tag/explorepage?refer=embed&ref=nubela.co" title="explorepage">#explorepage</a> <a href="https://www.tiktok.com/tag/futurecloud?refer=embed&ref=nubela.co" title="futurecloud">#futurecloud</a> <a href="https://www.tiktok.com/tag/officehumor?refer=embed&ref=nubela.co" title="officehumor">#officehumor</a> <a href="https://www.tiktok.com/tag/officelife?refer=embed&ref=nubela.co" title="officelife">#officelife</a> <a href="https://www.tiktok.com/tag/officefun?refer=embed&ref=nubela.co" title="officefun">#officefun</a></p>
<p><a href="https://www.tiktok.com/music/original-sound-7283921182016342817?refer=embed&ref=nubela.co" title="♬ original sound - Future Cloud Accounting">♬ original sound - Future Cloud Accounting</a></p>
</blockquote>
<p>FutureCloud TikTok on how they introduce the newest team member</p>
<p>It’s playful, inviting, and lighthearted; a glimpse of a work environment that values connection and camaraderie. I’m not saying a single video can paint the full picture of a company’s culture, but moments like these go a long way in setting a positive tone.</p>
<p>But expressing your culture doesn’t mean jumping on every TikTok trend. Something as simple as a well thought t-shirt can say a lot about your company culture, like it did for us at Evolve 2024.</p>
<h2 id="why-apparel-reflects-culture">Why Apparel Reflects Culture</h2>
<p>Corporate t-shirts have stood the test of time, usually made to celebrate achievements or commemorate milestones. Anything from project completions, annual events, team gatherings, and even festive celebrations calls for a t-shirt. These t-shirts go beyond just apparel, they become visible, tangible symbols of shared identity and pride.</p>
<p>Besides, it turns your employees into a walking, talking billboard for the company. If you’re subtle, your design can convey your culture without being heavy-handed or preachy. A sleek, stylish t-shirt can spark curiosity, make heads turn, and genuinely connect with people.</p>
<p><a href="https://www.linkedin.com/in/christopher-vardanyan-4b6b38111/?ref=nubela.co">Christopher Vardanyan</a>, co-founder of <a href="https://rocketmoving.com/facts-about-moving/?ref=nubela.co">Rocket Moving Services</a>, highlights how apparel plays a unique role in the moving industry. "In a business like ours, where teamwork and client trust are important, branded t-shirts serve as more than just uniforms, they create a sense of unity and professionalism. Our employees wear these shirts within working hours, and it shows their role as representatives of our company. These t-shirts act as mobile advertisements, catching the attention of potential clients during moves or in transit. We've even seen an uptick in inquiries, about 12%, from people who spot our team and want to know more about our services.''</p>
<p>For employees, it can be a badge of belonging. I didn’t wear the Proxycurl t-shirt because I had to; it’s casual, stylish, and reflects my pride in being part of the team. Even after I move on from the company, that t-shirt will hold a special place in my wardrobe.</p>
<h2 id="11-cool-corporate-t-shirt-design-ideas">11 Cool Corporate T-Shirt Design Ideas</h2>
<p>If you’re convinced of the role a well-thought t-shirt can play to further your corporate culture, let me indulge you in 11 trending t-shirt designs for 2025.</p>
<h3 id="1-minimalist-logo-t-shirt">1. Minimalist Logo T-shirt</h3>
<p>The fashion world is loving the aesthetic look. A minimalistic, not-trying-too-hard approach is the way to go. Besides, you don’t want your t-shirt to be cluttered, words all over the place and just overwhelming in general. Just your company name or logo might do the job!</p>
<p>Check out this Dunder Mifflin company t-shirt from the famous sitcom <em>The Office</em>. I know it’s a fictional company but they sure did a great job with their t-shirts. A standalone logo. Simple, sleek, and loud.</p>
<p><img alt="Dunder Mifflin Employee T-shirt from the famous sitcom The Office US, in blue with a white print" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-03-at-16.51.2.png" /></p>
<p>Dunder Mifflin Employee T-shirt from the famous sitcom <em>The Office</em> US</p>
<h3 id="2-tagline-t-shirt">2. Tagline T-Shirt</h3>
<p>Sometimes the best way to get your message across is to directly put it out there. In time the phrase resonates with the brand and gives people a better idea of what they can expect from the company’s culture.</p>
<p>Apple has one of the best taglines in the corporate world. The <em>‘Think Different’</em> tagline captures their innovative corporate culture.</p>
<p><img alt="Apple t-shirt with logo and 'Think Different' tagline print" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-03-at-16.47.50.png" /></p>
<p>Apple 'Think Different' T-shirt</p>
<h3 id="3-inside-jokes">3. Inside Jokes</h3>
<p>The beauty of an inside joke is not everyone will get it, but it sparks a conversation. And let’s be honest everyone enjoys good ol’ sensible humor.</p>
<p>A witty phrase or image that the employees get or even an industry limerick that other professionals can catch.</p>
<p><img alt="A witty coding-based t-shirt for developers" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-05-at-16.27.12.png" /></p>
<p>A funny, code-themed t-shirt designed for developers</p>
<h3 id="4-diverse-and-inclusive-t-shirts">4. Diverse and Inclusive T-shirts</h3>
<p>Diversity is a big issue these days and most companies are doing their best to put the word out. We are an equal opportunity provider.</p>
<p>What better to include that sentiment to your t-shirt. Use phrases and graphics to let everyone know the company's commitment to inclusivity.</p>
<p>If you want to pledge your commitment to diversity, there are plenty of initiatives you can take besides designing a t-shirt.</p>
<p><img alt="Two, diversity themed t-shirts in black and blue" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-05-at-16.30.00.png" /></p>
<p>Inclusive T-shirt Designs</p>
<h3 id="5-sustainably-sourced-t-shirts">5. Sustainably Sourced T-shirts</h3>
<p>If you’re still not on the sustainability bandwagon, it’s not too late. It’s time to source eco-conscious materials and give back to the planet. Plus, it sends a great message on your part about where your priorities lie.</p>
<p><img alt="Sustainable Fabrics" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/fab.jpg" /></p>
<p>Sustainable Fabrics</p>
<h3 id="6-employee-artwork">6. Employee Artwork</h3>
<p>Designs hit home when someone from the team is behind the monitor doing the work. A lot of corporations outsource their designs and would pay good money to get that personal touch. Brainstorm with your crew, come up with a design everyone can get on board with.</p>
<p>Rolling out Proxycurl’s very own Bali 2024 t-shirt design. Made by our amazing designer Arif Prasetyo.</p>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/CMYK-Preview.png" /></p>
<h3 id="7-event-specific-t-shirts">7. Event-Specific T-shirts</h3>
<p>Commemorate your achievements, annual and festive gatherings with event-specific t-shirts. Let everyone know that you work hard and play hard.</p>
<p>I still remember unboxing the PS2 when it was first released, more than 20 years ago (God I’m getting old!). Back in 2015, PlayStation celebrated their 20th anniversary with a commemorative t-shirt for everyone who made it possible. Now, with 2025 just around the corner, I can’t help but wonder what their 30th-anniversary t-shirts would look like.</p>
<p><img alt="Three Playstation employees celebrating 20 year anniversary with commemorate t-shirts" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-05-at-12.54.0.png" /></p>
<p>PlayStation employees celebrating 20 year anniversary with commemorative t-shirts</p>
<h3 id="8-cultural-icons">8. Cultural Icons</h3>
<p>Be proud of where you belong. Incorporating cultural sites and icons is a great design idea for a corporate t-shirt.</p>
<p>Presenting the first edition of Proxycurl’s very own t-shirt. Drawing inspiration from our roots in Singapore, the design features the iconic MRT system and highlights the Tai Seng station, our office's closest stop. A wearable nod to the city we call home.</p>
<p><img alt="Proxycurl Singapore themed t-shirt" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/image--104---1-.png" /></p>
<p>Proxycurl Singapore themed t-shirt</p>
<h3 id="9-typography">9. Typography</h3>
<p>Drop the norm. Use a typography that goes beyond your company logo and tagline. Let everyone know you’re creative and adventurous. But don’t go overboard and make the words unreadable.</p>
<p>Nintendo’s rehabilitation clinic t-shirt uses unconventional fonts and strings up a different typography arrangement than their norm.</p>
<p><img alt="Nintendo Rehabilitation Clinic t-shirt in Red" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-05-at-12.56.3.png" /></p>
<p>Nintendo Rehabilitation Clinic t-shirt</p>
<h3 id="10-printing-quality">10. Printing Quality</h3>
<p>Don’t spare any change in the design prints. If your designs are already peeling off after a few washes, it comes off as cheap. No tattered t-shirts are going in someone’s wardrobe. They go straight to the bin.</p>
<p>This imagined Tumblr t-shirt by Printsome is a great example of how an excellent printing job can transform a simple design into something sophisticated.</p>
<p><img alt="An imagined Tumblr t-shirt by Printsome in blue" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-05-at-16.06.0.png" /></p>
<p>An imagined Tumblr t-shirt by Printsome</p>
<h3 id="11-quotes">11. Quotes</h3>
<p>Inspiring quotes, or even humorous ones deserve a place in your t-shirt. Give your tagline a break, go with a quote that sums up your team spirit and corporate culture.</p>
<p><img alt="Industrial t-shirts with quote by Engineers Asgard Industries in black " src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Screenshot-2024-12-05-at-16.08.2.png" /></p>
<p>Industrial t-shirts with quote by Engineers Asgard Industries</p>
<h2 id="the-story-behind-our-t-shirts"><strong>The Story Behind Our T-Shirts</strong></h2>
<p>The Proxycurl team is a tight-knit group, despite working remotely. We actively engage in fun conversations, share memes, and enjoy light-hearted banter in our team channels. Though globally distributed, our team is primarily based in Singapore and Indonesia, with a few members like myself working from other parts of the world.</p>
<h3 id="our-singapore-themed-t-shirt">Our Singapore Themed T-shirt</h3>
<p>The t-shirt I wore at the Evolve event was designed by our creative head, Aji. It captures the spirit of Singapore, where Proxycurl was headquartered. The design centers around the iconic MRT, Singapore's bustling transportation system, with a frame inspired by the interior of an MRT carriage. It even highlights the Tai Seng station, the closest station to our office.</p>
<p><img alt="The Proxycurl team with our Singapore themed t-shirt" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/image--4---1-.jpg" /></p>
<p>The Proxycurl team with our Singapore themed t-shirt</p>
<p>The modern aesthetic is elevated with kanji characters and design elements, and our Proxycurl logo at the top-right ties it all together. The imagery can be seen as a journey from Tai Seng to Proxycurl HQ, symbolic and stylish.</p>
<h3 id="bali-2024-t-shirt">Bali 2024 T-shirt</h3>
<p>Another cherished design in our collection celebrates our annual company getaway. This year’s retreat took us to Bali, a destination famous for surfing and the sea.</p>
<p><img alt="The Proxycurl team with Bali 2024 t-shirt in our yearly getaway to Bali" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/image--5-.jpg" /></p>
<p>The Proxycurl team with Bali 2024 t-shirt in our yearly getaway!</p>
<p>To commemorate the trip, our designer Arif designed a whimsical "surfing cat" graphic, a creative twist on Garfield enjoying water sports. The design features our company name prominently at the top, with the occasion, "Bali 2024," subtly placed at the bottom left.</p>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/image--105---1--1.png" /></p>
<p>The Three Pussketeers (From left to right) Pixel, Meebles and Choba</p>
<p>The playful nod to Garfield is also a shout to our beloved office mascots, Meebles, Pixel, and Choba. The design perfectly reflects our team's fun and quirky personality, all the while preserving the memories of a great adventure.</p>
<h2 id="the-final-thread">The Final Thread</h2>
<p>Wrap up your next big milestone with a kick-ass t-shirt. It’s a token of belonging for your team and a bold statement of your company culture to the outside world.</p>
<p>At Proxycurl, we proudly told our story through our t-shirts. Today, that next chapter lives on at <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, where the founder behind Proxycurl is now building a new kind of B2B data platform.</p>
<p>If you’re here for the culture lesson, the point is simple: people notice what your team wears when it actually means something. If you’re here because you knew Proxycurl, now you know where the builder went.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="what-is-a-corporate-t-shirt">What is a corporate t-shirt?</h4>
<p>Corporate t-shirts are different from a corporate dress code or clothing. Corporate t-shirts are a memento, a symbol of celebration and achievement to the contributors to that success. Corporate clothing can include formal workwear, such as a dress, jacket, tie, golf shirt, neat pants, white shirt, etc.</p>
<h4 id="can-you-use-company-logos-on-t-shirts">Can you use company logos on t-shirts?</h4>
<p>You can use a trademarked logo on apparel for personal use, but not for professional use. Hire someone to create a logo or secure permission from the trademark owner to avoid potential legal issues.</p>
<h4 id="how-much-should-i-pay-an-artist-for-t-shirt-design">How much should I pay an artist for t-shirt design?</h4>
<p>If you're doing regular graphic design work, you'd probably be better off hiring someone. An in-house project can also help you get the personal touch. If you are outsourcing the work, the average rate can run from $60/hour. Some designers can charge upwards of $300 for the artwork.</p>
<h4 id="can-you-legally-put-quotes-on-t-shirts">Can you legally put quotes on t-shirts?</h4>
<p>Like logos, some quotes may also be trademarked. Research before using a quote for your t-shirt. Usually printing famous quotes are fine.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Changelog: Enhanced Employee Listing Match Rates by Company Name Matching ]]></title>
        <description><![CDATA[ We are now able to match on average 107% more employees of companies via the newly revamped Employee Listing Endpoint.

The endpoint now matches employees based on Professional Social Network company numerical ID and company name, not just the Professional Social Network company profile URL.




Match type
Previously
Revamped
Example ]]></description>
        <link>https://nubela.co/blog/enhanced-employee-listing-match-rates-by-company-name-matching/</link>
        <guid isPermaLink="false">674d68ecb4546d00014e82b8</guid>
        <category><![CDATA[ changelog ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Thu, 12 Dec 2024 17:44:46 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>We are now able to match on average <code>107%</code> more employees of companies via the newly revamped <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint" rel="noreferrer">Employee Listing Endpoint</a>.</p><p>The endpoint now matches employees based on <strong>Professional Social Network company numerical ID</strong> and <strong>company name</strong>, not just the Professional Social Network company profile URL.</p><table>
<thead>
<tr>
<th>Match type</th>
<th>Previously</th>
<th>Revamped</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>Professional Social Network company profile URL</td>
<td>✅</td>
<td>✅</td>
<td><a href="https://www.professionalsocialnetwork.com/company/walmart/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/walmart/</a></td>
</tr>
<tr>
<td>Professional Social Network company numerical ID</td>
<td>❌</td>
<td>✅</td>
<td><a href="https://www.professionalsocialnetwork.com/company/2646/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/2646/</a></td>
</tr>
<tr>
<td>Company name</td>
<td>❌</td>
<td>✅</td>
<td>Walmart, Walmart USA</td>
</tr>
</tbody>
</table>
<p>Take for example, this is Walmart's employee count based on the previous vs newly-revamped matching algorithm:</p><ul><li>Previously: <code>378,164</code></li><li>Revamped: <code>456,819</code></li></ul><p>The results?</p><blockquote>A nice improvement of <code>78,655</code> count, or 20.8%.</blockquote><h2 id="the-previous-matching-algorithm">The previous matching algorithm</h2><p>Previously we only matched company employees by checking if a person listed a company in their work experiences, specifically we only considered them a match if the company profile URL was the same as the target company profile, i.e.:</p><ul><li><a href="https://www.professionalsocialnetwork.com/company/walmart/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/walmart/</a> &amp; <a href="https://www.professionalsocialnetwork.com/company/walmart/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/walmart/</a> = MATCHED</li></ul><p>This approach resulted in more qualified profiles, but fewer results, in most cases about 50% less. However, this is not always what our users need. Some of users prefer more results returned.</p><h2 id="new-coynamematch-parameter">New <code>coy_name_match</code> parameter</h2><p>Introducing the new <code>coy_name_match</code> parameter! With this parameter, you can specify the matching criteria, to return profiles that <strong>match the name</strong> of your target company instead of just matching the company profile URL. </p><p>The <code>coy_name_match</code> parameter also matches company name <strong>without</strong> case sensitivity, e.g. a user profile with <code>apple</code> in his work experience would match for the same company of <a href="https://www.professionalsocialnetwork.com/company/apple/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/apple</a>. Previously that user won't be matched as an Apple employee.</p><p>We also improved the general employee listing matching algorithms with the following:</p><ul><li>Company Profile URL (vanity ID)</li><li>Company Profile URL (numerical ID)</li></ul><h2 id="lets-see-amazons-improvements">Let's see Amazon's improvements</h2><p>Taking another beloved company as example - Amazon, this is their main Professional Social Network company profile URL <a href="https://www.professionalsocialnetwork.com/company/amazon/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/amazon/</a></p><p>Based on the old matching algorithm, the Employee Listing Endpoint would only match: </p><ul><li><code>553,560</code> employees</li></ul><p>With the newly-revamped algorithm and <code>coy_name_match</code> parameter, Amazon's other Professional Social Network profiles based on vanity ID <a href="https://www.professionalsocialnetwork.com/company/amazon-bestt-offers/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/amazon-bestt-offers/</a> and numerical ID <a href="https://www.professionalsocialnetwork.com/company/88390279/?ref=nubela.co">https://www.professionalsocialnetwork.com/company/88390279/</a>, and users who input <code>Amazon</code>/<code>amazon</code> without the company's Professional Social Network URL would be considered in the same company. This brings the employee count to:</p><ul><li><code>579,472</code> employees</li></ul><p>An <code>25,912</code> increase in Amazon employees matched that would otherwise not be.</p><p>More data for you! </p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Fresh Data Is Here for Person, Company &amp; Employee Search API Endpoints ]]></title>
        <description><![CDATA[ We&#39;ve heard this product feature request a few times, and we&#39;re glad to launch this! It&#39;ll give more data quality to your workflows using our API endpoints. To fresh data! ]]></description>
        <link>https://nubela.co/blog/fresh-data-for-person-company-employee-search-api-endpoints/</link>
        <guid isPermaLink="false">6757ec42b4546d00014e868d</guid>
        <category><![CDATA[ changelog ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 10 Dec 2024 18:59:31 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_423.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>I am happy to share that you can now fetch fresh Search and Employee data from Proxycurl.</p>
<p>Since <a href="https://nubela.co/blog/product-update-search-api-v2/">the Search API revamp</a> that happened earlier this year, we've had many of our customers using the product and giving us valuable feedback, along with two of our existing products that are related to this update: the Employee Listing Endpoint and Employee Search Endpoint.</p>
<p>And one recurring feedback is that it'd be good if users can <strong>decide the data freshness themselves</strong>.</p>
<p>And as always, we heard and we improved the products.</p>
<p>I'm glad to share that you can now use the same <code>use_cache</code> parameter, the same one as our Person Profile Endpoint, to determine the freshness of data returned.</p>
<h2 id="whats-our-current-state">What's our current state?</h2>
<p>Currently the API endpoints are powered by LinkDB, our database of close to 500 million public LinkedIn profiles, i.e. when an API call is made, we sieve through the database and return the data from it.</p>
<p>However LinkDB is not always fresh, and thus results returned by these endpoints might not be fresh all the time <em>(related reading: <a href="https://nubela.co/blog/how-often-is-linkdb-updated/">How often is LinkDB updated?</a>)</em>.</p>
<p>With this revamp we will scrape the results in real time and return fresh data, if they are not already fresh yet, and if you use the <code>use_cache=if-recent</code> parameter <em>(next section)</em>.</p>
<h2 id="so-what-are-the-new-updates">So what are the new updates?</h2>
<h3 id="usage">Usage</h3>
<p>Using the <code>use_cache</code> parameter,</p>
<ul>
<li><code>if-present</code> (default value): returns results without any freshness guarantee</li>
<li><code>if-recent</code>: will make a best effort to return results of profiles <code>&lt;=29 days</code></li>
</ul>
<p>For the <code>use_cache=if-recent</code> parameter, <code>page_size</code> value of your API call must not be more than <code>10</code>. If it is <code>&gt;10</code>, it'll return a <code>400</code> error.</p>
<h3 id="credit-cost">Credit cost</h3>
<p>The default value, <code>use_cache=if-present</code>, will not consume any extra credit.</p>
<p>The <code>use_cache=if-recent</code> parameter is a premium parameter and will cost additional credits.</p>
<ul>
<li>Good news is if you're on a Growth plan or larger, it costs only <code>1</code> extra credit.</li>
<li>If you're not on the Growth plan or larger, it'll cost <code>2</code> extra credits.</li>
</ul>
<p>Don't worry about invalid profiles because we won't charge credits for those.</p>
<blockquote>
<p><strong>A quick 2026 note on Proxycurl</strong></p>
<p>Proxycurl has since been sunset. I was the founder behind Proxycurl, and I am now building NinjaPear. I am leaving this post up because the product update was real and useful at the time, but if you're building something new today, you should be looking at NinjaPear instead.</p>
<p>NinjaPear does <strong>not</strong> scrape LinkedIn. It pulls B2B data from public web sources and first-party infrastructure, which gives you data that is richer in many cases, in a similar JSON-first shape, without the same legal liability that comes with LinkedIn-dependent systems.</p>
</blockquote>
<h2 id="what-to-use-now-instead">What to use now instead</h2>
<p>If you came here looking for the old Proxycurl Search, Employee, Person, or Company workflows, NinjaPear is the modern replacement path.</p>
<p>For person and employee enrichment, start with <a href="https://nubela.co/companies?ref=nubela.co">Employee API</a> endpoints on NinjaPear. The closest equivalent is the Person Profile endpoint, which returns work history, education, location, and social handles from public sources.</p>
<p>For company lookups, the <a href="https://nubela.co/company-api?ref=nubela.co">Company API</a> gives you:</p>
<ul>
<li>Website Lookup</li>
<li>Company Details</li>
<li>Employee Count</li>
<li>Company Updates</li>
<li>Company Funding</li>
<li>Company Logo</li>
</ul>
<p>If your old use case was search plus enrichment, the practical NinjaPear flow is:</p>
<ol>
<li>Resolve a company name to a website with Company Website Lookup.</li>
<li>Pull company details or employee count.</li>
<li>Enrich a person with Person Profile or find a verified work email.</li>
<li>Monitor the company for fresh updates if timing matters.</li>
</ol>
<p>That last part matters a lot more than most people think. Back when I was building Proxycurl, a lot of demand for "fresh profile data" was really demand for <strong>fresh buying signals</strong>. NinjaPear leans into that directly with company updates, employee count, funding, customer, and competitor data.</p>
<h2 id="happy-searching">Happy searching</h2>
<p>We recognized the importance of fresh data returned for API calls involving searches, because nobody wants to search and get stale data back.</p>
<p>I hope this revamp gave users more power through Proxycurl API at the time, and if you're building now, I think NinjaPear is the better path forward.</p>
<p>As always, if you've any questions, email us at <a href="mailto:hello@nubela.co">hello@nubela.co</a> or drop us a text in the live chat.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ I Built a Diversity App to Pull Employee Composition of Any Company ]]></title>
        <description><![CDATA[ Celebrate diversity. Learn how to build a diversity app by pulling employee Composition through any company&#39;s Professional Social Network URL. ]]></description>
        <link>https://nubela.co/blog/built-app-that-pulls-company-employee-composition/</link>
        <guid isPermaLink="false">672a06ff1cb59d0001b17724</guid>
        <category><![CDATA[ employee composition ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Thu, 05 Dec 2024 12:40:58 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>At Proxycurl, we don’t just believe in the power of diverse talent; we proudly embrace it. For that cause, we wanted something visual, something that would celebrate diversity in the workplace while serving as a medium for meaningful company insights. </p><p>As a developer, I spearheaded that challenge and coded a full interactive widget that takes a company's Professional Social Network profile URL and instantly generates a vibrant pie-chart. This chart visually breaks down the company’s employee composition by country and job title, offering a clear picture of global representation. It’s a simple yet powerful tool to highlight what makes teams unique.</p><p>Here's the final product:</p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/Group-6.png" class="kg-image" alt="" loading="lazy" width="1160" height="917"></figure><p><em><strong>Note: </strong>Find the full code on our </em><a href="https://github.com/nubelaco/use-case-examples/tree/main/employee-composition?ref=nubela.co" rel="noreferrer"><em>GitHub repo</em></a><em>.</em></p><p>Today, in the spirit of celebrating diversity paired with functionality, I’ll guide you through how I developed this app, and how you can do the same using my source code.</p><p>The app will display your company's employee composition based on a company's Professional Social Network profile URL. Specifically, </p><ol><li> <strong>Composition by country</strong> <em>(such as 85% US, 15% UK)</em></li><li><strong>Composition by job titles</strong> <em>(such as software engineer, designer, and account executive)</em>.</li></ol><p>At Proxycurl, our dedication to fostering diversity inspired this project. But if you’re wondering how this app could serve you, the possibilities are huge:</p><p><em>Use case 1: for investment teams to identify investment signals </em></p><ul><li>Let's say you're an early-stage VC firm, you can track startups with &lt;10 employees and monitor for recent fast growth, which suggests that they're doing well and a potential for your investment.</li></ul><p><em>Use case 2: for sales teams to identify buying signals </em></p><ul><li>Let's say you're selling a service to optimize cloud cost in AWS, you can monitor for companies that are hiring lots of backend engineers and infer that they have heavy use of cloud server, potentially needing your service.</li></ul><p><em>Use case 3: for marketing teams to track competitors' growth strategies</em></p><ul><li>Let's say you're devising the marketing focus for the next quarter, and you observed that your competitor has been hiring aggressively for video content marketers, that would suggest that they're going after the video channel strongly. </li></ul><p>Still not convinced? Here's an app demo to give you a push. </p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/Nov-26-202412-43-14-ezgif.com-optimize.gif" class="kg-image" alt="" loading="lazy" width="594" height="590"></figure><h2 id="prerequisites">Prerequisites</h2><p>Here's what you'll need to get started:</p><ul><li>A basic aptitude for coding</li><li>Node v18+</li><li><a href="https://proxycurl.com/?ref=nubela.co" rel="noreferrer">Proxycurl API key</a> - this is where we will pull the employee data based on their company Professional Social Network profile URL</li><li>Basic knowledge of React.js &amp; Next.js</li><li>Basic understanding of Tailwind CSS</li></ul><h2 id="step-1-create-a-new-nextjs-project">Step 1: Create a new Next.js project</h2><p>To start, you’ll need to create the foundation and structure of your app. Set up a new Next.js project.</p><pre><code class="language-bash">npx create-next-app@latest employee-composition
cd employee-composition &amp;&amp; npm run dev
</code></pre><p>Next, we’ll install essential UI components.</p><pre><code class="language-bash">npx shadcn@latest add button card input</code></pre><p>Now that we've set up the core framework and basic UI components, time to build from the bottom up!</p><h2 id="step-2-pulling-employee-data-via-api">Step 2: Pulling employee data via API</h2><p>We will use Proxycurl to pull the entire employee list of a company input by the user. First, sign up for <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co" rel="noreferrer">Proxycurl</a> and get free credits. Under your dashboard, navigate to <strong>Company Endpoints</strong>, then find <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint" rel="noreferrer"><strong>Employee Listing Endpoint</strong></a>. Here’s an example request:</p><pre><code class="language-Python">import requests

api_key = 'YOUR_API_KEY'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/company/employees/'
params = {
    'url': 'https://www.professionalsocialnetwork.com/company/microsoft',
    'coy_name_match': 'include',
    'use_cache': 'if-present',
    'country': 'us',
    'enrich_profiles': 'enrich',
    'role_search': '(co)?-?founder',
    'page_size': '10',
    'employment_status': 'current',
    'sort_by': 'recently-joined',
    'resolve_numeric_id': 'false',
}
response = requests.get(api_endpoint,
                        params=params,
                        headers=headers)</code></pre><p>You can also choose to automatically enrich employee profiles with other data points using the <code>enrich_profiles = enrich</code> parameter.</p><h2 id="step-3-create-a-nextjs-api">Step 3: Create a Next.js API</h2><p>Directly exposing your API key in the client is a security risk. So let's take a detour and create a Next.js API route that serves as a proxy for API calls. Add the following code to <code>app/api/employeeListing/route.js</code>:</p><pre><code class="language-js">import { NextResponse } from "next/server";

export async function GET(req) {
  const { searchParams } = new URL(req.url);
  const company_url = searchParams.get("company_url");
  const next_page_url = searchParams.get("next_page_url")
  const after = searchParams.get("after");

  const finalUrl =
    next_page_url &amp;&amp; next_page_url !== 'undefined'
      ? `${next_page_url}&amp;after=${after}&amp;enrich_profiles=enrich`
      : `https://nubela.co/proxycurl/api/Professional Social Network/company/employees/?url=${company_url}&amp;enrich_profiles=enrich`;


  try {
    const response = await fetch(finalUrl, {
      headers: {
        Authorization: `Bearer ${process.env.PROXYCURL_API_KEY}`,
      },
    });

    const data = await response.json();
    return NextResponse.json(data);
  } catch (error) {
    return NextResponse.json({ error });
  }
}

</code></pre><h2 id="step-4-input-company-professional-social-network-url">Step 4: Input company Professional Social Network URL</h2><p>You need to input a Professional Social Network company URL to fetch employee data. For this, we’ll use the <code>Input</code> and <code>Button</code> components we installed earlier. </p><p>In <code>app/page.js</code> , add the input &amp; button components from <code>shadcn</code>.</p><pre><code class="language-jsx">"use client";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";

const [companyUrl, setCompanyUrl] = useState("");

const handleKeyPress = (e) =&gt; {
    if (e.key === "Enter") {
      handleSubmit();
    }
};

 return (
&lt;div className="mx-auto w-full max-w-2xl min-h-[100vh] flex flex-col p-4"&gt;
    &lt;div className="flex flex-col gap-4 mx-auto w-full sm:flex-row sm:w-auto"&gt;
      &lt;Input
        className="w-full sm:w-96"
        placeholder="Professional Social Network Company URL"
        value={companyUrl}
        onChange={(e) =&gt; setCompanyUrl(e.target.value)}
        onKeyPress={handleKeyPress}
      /&gt;
      &lt;Button className="w-full sm:w-auto" onClick={handleSubmit}&gt;
        Submit
      &lt;/Button&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre><p>This creates an input field and a button for submitting the Professional Social Network URL. It should look something like this:</p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/company-url-input.png" class="kg-image" alt="" loading="lazy" width="1190" height="424"></figure><p>Great! We are halfway there! </p><h2 id="step-5-fetching-employee-data-and-handling-pagination">Step 5: Fetching employee data and handling pagination</h2><p>Now let's define the <code>handleSubmit</code> in <code>app/page.js</code>. The <code>handleSubmit</code> function triggers the API call. Here’s how it’s implemented in <code>app/page.js</code>:</p><pre><code class="language-jsx">const handleSubmit = async (e) =&gt; {
    e.preventDefault();
    await fetchEmployeeListing();
};
</code></pre><p>API call done! But what about pagination? The logic here is if there's <code>next_page</code> URL in the response, we will call that URL until there isn't one, which is indicated by <code>next_page</code> being <code>null</code>.</p><p>The <code>fetchEmployeeListing</code> function handles API requests, including pagination. If <code>next_page</code> exists in the response, it fetches data until all pages are retrieved.</p><pre><code class="language-js">  const fetchEmployeeListing = async (next_page_url) =&gt; {
    try {
      setIsLoading(true);
      const res = await fetch(
        `/api/employeeListing?company_url=${companyUrl}&amp;next_page_url=${next_page_url}`,
        {
          method: "GET",
          headers: {
            "Content-Type": "application/json",
          },
        },
      );
      const data = await res.json();

      const cleanData = data.employees.filter(
        (employee) =&gt; employee.profile !== null,
      );

      const company_id = companyUrl.split("/company/")[1].replace("/", "");

      handleSaveQuery({
        company_id: company_id,
        employees: cleanData,
      });

      if (data.next_page !== null) {
        fetchEmployeeListing(data.next_page);
      } else {
        const employeeListing = JSON.parse(
          localStorage.getItem("employeeListing"),
        );

        const countryCount = {};

        employeeListing[company_id].employees.forEach((employee) =&gt; {
          const country = employee.profile.country_full_name;
          countryCount[country] = (countryCount[country] || 0) + 1;
        });

        const occupationCount = {};

        employeeListing[company_id].employees.forEach((employee) =&gt; {
          const occupation = employee.profile.occupation;
          occupationCount[occupation] = (occupationCount[occupation] || 0) + 1;
        });

        try {
          const res = await fetch(`/api/categorizeJobTitle`, {
            method: "POST",
            body: JSON.stringify({ job_title: occupationCount }),
          });

          const categorizedOccupationJSON = await res.json();
          const categorizedOccupationCount = JSON.parse(categorizedOccupationJSON);

          setCountryData({
            labels: Object.keys(countryCount),
            data: Object.values(countryCount),
          });

          setOccupationData({
            labels: Object.keys(categorizedOccupationCount),
            data: Object.values(categorizedOccupationCount),
          });
        } catch (error) {
          console.log(error);
        }

        setIsLoading(false);
        return;
      }
    } catch (error) {
      console.log(error);
    }
  };
</code></pre><p>Now, it's time to implement the functionality to store the results of the API calls in your local storage:</p><pre><code class="language-js"> const handleSaveQuery = ({ company_id, employees }) =&gt; {
    const storedEmployeeListing =
      JSON.parse(localStorage.getItem("employeeListing")) || [];

    if (storedEmployeeListing[company_id]?.employees?.length &gt; 0) {
      const updatedEmployees = [
        ...storedEmployeeListing[company_id].employees,
        ...employees,
      ];
      localStorage.setItem(
        "employeeListing",
        JSON.stringify({
          ...storedEmployeeListing,
          [company_id]: {
            employees: updatedEmployees,
          },
        }),
      );
    } else {
      localStorage.setItem(
        "employeeListing",
        JSON.stringify({
          ...storedEmployeeListing,
          [company_id]: {
            employees: employees,
          },
        }),
      );
    }
  };
</code></pre><h2 id="step-6-displaying-the-data-in-a-pie-chart">Step 6: Displaying the data in a pie chart</h2><p>Now the fun part. After getting all of data, we want to be able to easily understand them, the various countries and job titles of the employees in their proper percentages.</p><p>For this, we'll use a pie chart component from <a href="https://apexcharts.com/?ref=nubela.co" rel="noreferrer">ApexCharts</a>.</p><p>First, create <code>app/components/Pie.jsx</code>:</p><pre><code class="language-jsx">'use client';
import React from 'react';
import dynamic from 'next/dynamic';

const Chart = dynamic(() =&gt; import('react-apexcharts'), { ssr: false });

function PieChart({chartData}) {

  const { labels, data } = chartData;

  if (!data || !labels ) return null;

  const options = {
    chart: {
      type: 'pie',
      foreColor: 'hsl(var(--foreground))',
      fontFamily: 'var(--font-geist-sans)'
    },
    labels: labels,
    colors: [
      'hsl(var(--chart-1))',
      'hsl(var(--chart-2))',
      'hsl(var(--chart-3))',
      'hsl(var(--chart-4))',
      'hsl(var(--chart-5))',
    ],
    legend: {
      position: 'bottom',
      fontSize: '12px',
      fontFamily: 'var(--font-geist-sans)',
      height: 'auto',
      offsetY: 10,
      labels: {
        colors: 'hsl(var(--foreground))'
      },
      markers: {
        width: 8,
        height: 8,
      },
      itemMargin: {
        horizontal: 8,
        vertical: 3
      },
      containerMargin: {
        top: 12
      },
      formatter: function(seriesName, opts) {
        return seriesName.length &gt; 30 ? seriesName.substring(0, 30) + '...' : seriesName;
      }
    },
    tooltip: {
      style: {
        fontSize: '14px',
        fontFamily: 'var(--font-geist-sans)'
      }
    },
    responsive: [{
      breakpoint: 480,
      options: {
        chart: {
          width: 300
        },
        legend: {
          position: 'bottom'
        }
      }
    }]
  };

  return (
    &lt;div className="w-[500px]"&gt;
      &lt;Chart
        options={options}
        series={data}
        type="pie"
        width="500"
        height="500"
      /&gt;
    &lt;/div&gt;
  );
}

export default PieChart;
</code></pre><p>What you'll get is this beautiful pie chart displaying all the data you have, in a slick and visually-aesthetic manner.</p><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/image-32.png" class="kg-image" alt="" loading="lazy" width="1218" height="2002"></figure><p></p><p>Congratulations! You now have a working employee composition App. </p><h2 id="wrapping-up">Wrapping Up</h2><p>This project was a fun little way to express our values and I sure had fun on this project. But remember, nothing is set in stone and don't fret to add your own twist along the way. </p><p>Beyond Proxycurl's commitment to diversity, this project also serves an excellent example to what our API can do in terms of real-world use cases. Proxycurl’s API capabilities surpass just enriching employee and company data; it serves as powerful tools for applications requiring detailed professional insights. </p><p>Take the first step. Sign up for <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co" rel="noreferrer">Proxycurl</a> today!</p><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">What does diversity cover?</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">A diverse workforce represents the </span><b><strong style="white-space: pre-wrap;">a vast</strong></b> <b><strong style="white-space: pre-wrap;">range of people.</strong></b><span style="white-space: pre-wrap;"> People with different nationalities, ethnicities, religions, people with disabilities, and both men and women. It also means valuing and cherishing those differences.</span></p></div>
        </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">How do you align yourself with workplace diversity?</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">The best way you can align yourself with diversity is to highlight your policies and initiatives to support the cause. Share stories and represent your commitment by integrating visual tools that highlight your team’s composition. It’s a simple yet impactful way to celebrate diversity and share your values with your audience. </span></p></div>
        </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Why do I need an employee composition app?</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">A commitment to celebrate and embrace diversity is a big reason enough. But if you are looking for more practical use cases:</span></p><ul><li value="1"><b><strong style="white-space: pre-wrap;">For investors</strong></b><span style="white-space: pre-wrap;">: Track companies with rapid growth as investment signals.</span></li><li value="2"><b><strong style="white-space: pre-wrap;">For sales teams</strong></b><span style="white-space: pre-wrap;">: Identify potential leads based on hiring trends.</span></li><li value="3"><b><strong style="white-space: pre-wrap;">For marketers</strong></b><span style="white-space: pre-wrap;">: Monitor competitor strategies based on hiring patterns.</span></li></ul></div>
        </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><b><strong style="white-space: pre-wrap;">Can the app handle large companies with thousands of employees?</strong></b></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Yes, the app supports pagination and retrieves data in batches to manage large datasets efficiently.</span></p></div>
        </div> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ 30 (+1) Top LinkedIn Scrapers for 2026 with Pros &amp; Cons ]]></title>
        <description><![CDATA[ 30+ best Professional Social Network scraping tools in 2025 for your data needs. Unlock Professional Social Network&#39;s database with our guide towards your business success. ]]></description>
        <link>https://nubela.co/blog/reviewing-top-linkedin-scraping-api-services/</link>
        <guid isPermaLink="false">62cbf703382e1600017a4397</guid>
        <category><![CDATA[ scraping tools ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Tue, 03 Dec 2024 11:20:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_421.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>After testing, buying, breaking, and in one case getting sued around this category, my short answer is this: <strong>most LinkedIn scrapers still work in 2026, but many are worse businesses than they are tools</strong>. If you just want the shortlist, Proxycurl was the old API-first favorite, but <strong>Proxycurl API has been sunset</strong> and the founder behind it is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is not a LinkedIn scraper at all. For teams that still insist on scraping LinkedIn, PhantomBuster, Evaboot, People Data Labs, and Coresignal are still alive. For teams that want the commercial outcome without the LinkedIn liability, NinjaPear is the more durable bet.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/dataanalysis</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Timely_Note_1904</span>
<span style="color:#878a8c;">· ▲ 18</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Scraping is not the hard part. They will discover and ban you very quickly.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/dataanalysis/comments/1kkv5t2/can_i_legally_scrape_data_from_linkedin_indeed/mrxyep5/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That comment is blunt, and unfortunately, it is directionally right.</p>
<p>I am <strong>not</strong> going to rewrite this piece from scratch because the original structure was useful. I am going to do the much more practical thing: update it in place for 2026, fix the censored "Professional Social Network" nonsense, mark what is dead, and tell you where the legal landmines actually are.</p>
<p>A few 2026 updates before we start:</p>
<ul>
<li><strong>Proxycurl API has been sunset.</strong> I kept the original sections where they still help explain the category, but if you are reading this in 2026, treat Proxycurl as historical context, not a live recommendation.</li>
<li><strong>The founder behind Proxycurl is now building NinjaPear.</strong> NinjaPear is a competitive intelligence and B2B data platform, not a LinkedIn automation tool.</li>
<li><strong>iScraper is dead.</strong> It got sued by LinkedIn. I added it as the "+1" because pretending dead tools never existed is how people repeat avoidable mistakes.</li>
<li>I checked the major tools below for 2026 status. Where pricing or positioning changed, I updated it.</li>
</ul>
<p>Welcome to the only guide on <strong>LinkedIn scrapers</strong> you will ever need. In this article, I will go through:</p>
<ul>
<li>30+1 of the best LinkedIn scraping tools in 2026, categorized based on their nature.</li>
<li>Pros and cons of each scraper.</li>
<li>How to find the best LinkedIn scraper for you.</li>
<li>Whether LinkedIn scraping is legal.</li>
<li>My updated recommendation, including a bonus non-LinkedIn alternative.</li>
<li>Final thoughts.</li>
</ul>
<p>I'll start with an overview of all the LinkedIn scraper categories. This still matters because most buyers make the same mistake I made years ago: comparing an automation extension to an API vendor to a bulk dataset seller as though they are the same product. They are not.</p>
<p><img alt="Infographic on LinkedIn scrapers, categorized with features and suitability" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Table-1.png" /></p>
<p>LinkedIn scraper categories with features and suitability</p>
<p>Now, let's look at each of our 31 entrants in the list. Each of these LinkedIn scrapers is categorized and weighed based on price, free version availability, and one more thing I care a lot more about in 2026: <strong>business durability</strong>.</p>
<p><img alt="Full list of LinkedIn scrapers in categories" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/12/Full-list-of-31-Professional%20Social%20Network-scrapers-in-categories.webp" /></p>
<p>List of all 31 LinkedIn scrapers categorized into six major groups, plus one dead tool worth studying</p>
<h2 id="full-scale-enterprise-linkedin-scrapers">Full-scale enterprise LinkedIn scrapers</h2>
<p>These scrapers are built for larger companies that need scale, enrichment, analytics, and integrations. In practice, this category splits into two camps:</p>
<ol>
<li>API-first vendors that want to sit inside your product or workflow.</li>
<li>Database vendors that already collected the data and want to sell access to it.</li>
</ol>
<p>That distinction matters because the tradeoff is usually <strong>freshness vs convenience</strong>.</p>
<h3 id="1-proxycurl-sunset-but-worth-understanding">1. Proxycurl, sunset but worth understanding</h3>
<blockquote>
<p><strong>2026 update:</strong> Proxycurl API has been sunset. I am retaining this section because the original article relied on it heavily and because Proxycurl shaped this category for a few years. But if you are evaluating tools today, skip ahead to NinjaPear for the modern Nubela product, or to the other live vendors below.</p>
</blockquote>
<p>The biggest reason people used Proxycurl was that it was a versatile API designed to be built into an existing system or workflow. No VPNs. No proxy juggling. No rotating pile of LinkedIn accounts. Just an API call and structured B2B data.</p>
<p>That was always the real appeal. Not that it was magical. Just that it removed a lot of the gross operational plumbing.</p>
<p>It was also developer-friendly, and yes, the number of endpoints could be intimidating if you were non-technical. That part of the original article was fair.</p>
<p>The other thing Proxycurl got right was this idea that buyers care about <strong>freshness controls</strong>, not just raw access. That is still one of the most useful lenses for comparing vendors today.</p>
<h4 id="proxycurl-pros">Proxycurl Pros</h4>
<ul>
<li>API-first and easy to integrate.</li>
<li>Strong data depth for person and company enrichment.</li>
<li>Historically good freshness controls.</li>
<li>Built for scale, not one-off CSV exports.</li>
</ul>
<h4 id="proxycurl-cons">Proxycurl Cons</h4>
<ul>
<li>Sunset, so not a live option in 2026.</li>
<li>Better for developers than for solo operators.</li>
<li>If you wanted a Chrome extension and instant CSVs, it was never really that product.</li>
</ul>
<h4 id="proxycurl-pricing">Proxycurl Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Status</td>
<td><strong>Sunset</strong></td>
</tr>
<tr>
<td>Recommendation in 2026</td>
<td>Historical context only</td>
</tr>
</tbody>
</table>
<h3 id="2-ninjapear-the-bonus-alternative">2. NinjaPear, the bonus alternative</h3>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is here because pretending every buyer must scrape LinkedIn is lazy thinking.</p>
<p>NinjaPear is <strong>not</strong> a LinkedIn scraper. It is not a browser automation tool. It does not ask you to install a Chrome extension and pray your account survives. It is a <strong>competitive intelligence and B2B data platform</strong> that gives you a lot of the commercial wins people chase with LinkedIn automation, without putting your business on top of LinkedIn-derived data.</p>
<p>That difference is not semantic. It is the whole point.</p>
<p>What can you do with NinjaPear instead of LinkedIn scraping?</p>
<ul>
<li>Find a company's customers with the <a href="https://nubela.co/companies?ref=nubela.co">Customer API</a></li>
<li>Track competitor and prospect account changes with the <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a></li>
<li>Enrich people and companies from public web data</li>
<li>Build prospect lists in <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a></li>
<li>Pull company details, work emails, employee count, and competitor data without touching LinkedIn</li>
</ul>
<p>When I was running FluxoMetric, I would have killed for this exact category of product. Not because it is morally superior. Because it is operationally saner.</p>
<p>LinkedIn automation is usually trying to approximate one of these outcomes:</p>
<ul>
<li>figure out who matters at an account</li>
<li>figure out what changed at an account</li>
<li>figure out who buys from whom</li>
<li>figure out when to reach out</li>
</ul>
<p>NinjaPear does those things directly.</p>
<h4 id="ninjapear-pros">NinjaPear Pros</h4>
<ul>
<li>Avoids LinkedIn account automation risk entirely.</li>
<li>Gives you competitive intelligence data LinkedIn does not really provide well anyway.</li>
<li>API, spreadsheet, and UI workflows are all there.</li>
<li>Transparent usage-based pricing, no big enterprise minimums.</li>
</ul>
<h4 id="ninjapear-cons">NinjaPear Cons</h4>
<ul>
<li>Not a LinkedIn scraper, so if your requirement is literally "give me the LinkedIn profile DOM as JSON," this is not that.</li>
<li>Newer product category, which means some buyers still need to unlearn old habits.</li>
</ul>
<h4 id="ninjapear-pricing">NinjaPear Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free Trial</td>
<td>3-day free trial, 10 credits included</td>
</tr>
<tr>
<td>Paid</td>
<td>Usage-based, no monthly minimums</td>
</tr>
<tr>
<td>Best for</td>
<td>Teams that want B2B outcomes without LinkedIn liability</td>
</tr>
</tbody>
</table>
<h3 id="3-phantombuster">3. PhantomBuster</h3>
<p>PhantomBuster is still alive in 2026 and still doing what PhantomBuster has always done: cloud automation for growth workflows, including LinkedIn scraping.</p>
<p>The product has matured a bit, but my opinion has not changed much. It is useful if you want <strong>automation</strong>. It is much less compelling if you want a clean, durable data infrastructure layer.</p>
<p>PhantomBuster's own pricing page now starts at <strong>$59/month</strong> with a 14-day free trial, which is a small but meaningful update from the older pricing in the imported article.</p>
<p>The catch remains the same. If you scrape private LinkedIn data through your own account, you are carrying the account risk yourself.</p>
<h4 id="phantombuster-pros">PhantomBuster Pros</h4>
<ul>
<li>Good for repetitive growth workflows.</li>
<li>Large library of prebuilt automations.</li>
<li>Still one of the easiest ways for non-developers to get started.</li>
</ul>
<h4 id="phantombuster-cons">PhantomBuster Cons</h4>
<ul>
<li>Still easier to abuse than to operationalize well.</li>
<li>UI can feel like a toolbox exploded.</li>
<li>Account safety depends heavily on how aggressive you are.</li>
<li>Better for automation than for clean downstream data architecture.</li>
</ul>
<h4 id="phantombuster-pricing">PhantomBuster Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free Trial</td>
<td>14 days</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$59/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Up to $399+/mo depending on plan</td>
</tr>
</tbody>
</table>
<h3 id="4-people-data-labs">4. People Data Labs</h3>
<p>People Data Labs is still a major player for teams that want an enrichment database, not a scraper they operate themselves.</p>
<p>That distinction is why some companies love PDL and others bounce off it immediately.</p>
<p>If your use case is batch enrichment, scoring, analytics, or appending data to an existing system, PDL still makes sense. If your use case is "I need this exact profile to be fresh right now," it gets less exciting.</p>
<p>Their publicly listed person pricing still starts at <strong>$98/month</strong>, which aligns with the original article.</p>
<h4 id="people-data-labs-pros">People Data Labs Pros</h4>
<ul>
<li>Large structured datasets.</li>
<li>Good API ergonomics for enrichment workflows.</li>
<li>Better fit for products than for scrappy manual prospecting.</li>
</ul>
<h4 id="people-data-labs-cons">People Data Labs Cons</h4>
<ul>
<li>Freshness is the obvious caveat.</li>
<li>Gets expensive at volume.</li>
<li>Not the fastest path if your team needs one-off operator workflows.</li>
</ul>
<h4 id="people-data-labs-pricing">People Data Labs Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Up to 100 records</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$98/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom pricing</td>
</tr>
</tbody>
</table>
<h3 id="5-zoominfo">5. ZoomInfo</h3>
<p>ZoomInfo is still ZoomInfo. Huge dataset. Expensive. Sales-led. Not built for people who enjoy transparent pricing.</p>
<p>If you buy ZoomInfo, you are not buying a scraper. You are buying a full go-to-market data layer with all the usual pros and pains that come with it.</p>
<p>I still would not recommend it to a developer looking for a flexible LinkedIn scraping substitute. I would recommend it to a large revenue team that wants an all-in-one vendor and has budget.</p>
<h4 id="zoominfo-pros">ZoomInfo Pros</h4>
<ul>
<li>Huge contact and company database.</li>
<li>Strong integrations and intent features.</li>
<li>Mature enterprise workflows.</li>
</ul>
<h4 id="zoominfo-cons">ZoomInfo Cons</h4>
<ul>
<li>Pricing opacity remains annoying.</li>
<li>Overkill for many startups.</li>
<li>Not API-first in the way technical teams usually want.</li>
</ul>
<h4 id="zoominfo-pricing">ZoomInfo Pricing</h4>
<p>Their pricing is still not public. The older reference point of <strong>~$14,995/year</strong> as a starting number is still directionally useful, but treat it as a market estimate, not a quoted list price.</p>
<h3 id="6-linkedin-sales-navigator-api">6. LinkedIn Sales Navigator API</h3>
<p>Like I said in the original article, LinkedIn has its own paid API options. And like I said then, the problem is not whether it exists. The problem is <strong>getting and keeping access</strong>.</p>
<p>That remains true in 2026.</p>
<p>You still have approvals, restrictions, product-fit questions, and enough administrative friction to make smaller teams reach for third-party tools immediately.</p>
<h4 id="linkedin-sales-navigator-api-pros">LinkedIn Sales Navigator API Pros</h4>
<ul>
<li>Official channel.</li>
<li>Real-time access for approved use cases.</li>
<li>Strong search/filter capabilities.</li>
</ul>
<h4 id="linkedin-sales-navigator-api-cons">LinkedIn Sales Navigator API Cons</h4>
<ul>
<li>Hard to access.</li>
<li>Approval process is still the real bottleneck.</li>
<li>Not built for every use case people imagine.</li>
</ul>
<h4 id="linkedin-sales-navigator-api-pricing">LinkedIn Sales Navigator API Pricing</h4>
<p>Pricing is still not transparently published for API access. The common public benchmark remains the Sales Navigator seat itself at <strong>~$99+/user/month</strong>, but actual API access is a separate conversation.</p>
<h3 id="7-zopto">7. Zopto</h3>
<p>Zopto is still alive and still very much an outreach-first product that happens to sit on top of LinkedIn workflows.</p>
<p>If you want to automate outbound sequences tied to LinkedIn activity, Zopto can still do the job. If you want deep enrichment or clean data extraction, this is not where I would start.</p>
<h4 id="zopto-pros">Zopto Pros</h4>
<ul>
<li>Works well for LinkedIn outreach sequences.</li>
<li>Sales Navigator compatibility helps.</li>
<li>Useful for teams that want campaign orchestration more than data plumbing.</li>
</ul>
<h4 id="zopto-cons">Zopto Cons</h4>
<ul>
<li>Expensive for smaller teams.</li>
<li>You are still playing inside LinkedIn's anti-automation blast radius.</li>
<li>Not a true data platform.</li>
</ul>
<h4 id="zopto-pricing">Zopto Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>No free trial</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$197/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$237/user/mo</td>
</tr>
</tbody>
</table>
<h2 id="open-source-linkedin-scrapers">Open-source LinkedIn scrapers</h2>
<p>If you are a developer, this category is still tempting.</p>
<p>I get it. Free is seductive.</p>
<p>But "free" in LinkedIn scraping usually means you pay in one of three currencies:</p>
<ul>
<li>maintenance time</li>
<li>account risk</li>
<li>broken weekends</li>
</ul>
<p>When I was running FluxoMetric, I burned ~40 hours on one scraping setup that looked cheap on day one and became incredibly expensive by week three. That lesson has held up annoyingly well.</p>
<h3 id="8-linkedin_scraper-by-joeyism">8. <code>linkedin_scraper</code> by joeyism</h3>
<p>This project is still the most recognizable open-source LinkedIn scraper in the Python ecosystem.</p>
<p>The core value proposition remains exactly what it was: make profile scraping with Python less painful.</p>
<p>It is still useful for developers who want to tinker, learn, or build a narrow workflow. It is still a bad idea if you think open source means zero operational burden.</p>
<h4 id="linkedin_scraper-pros"><code>linkedin_scraper</code> Pros</h4>
<ul>
<li>Free.</li>
<li>Familiar Python workflow.</li>
<li>Good starting point for developers who want control.</li>
</ul>
<h4 id="linkedin_scraper-cons"><code>linkedin_scraper</code> Cons</h4>
<ul>
<li>Continuous maintenance burden.</li>
<li>Fragile against DOM changes.</li>
<li>Operational risk is still yours.</li>
</ul>
<h3 id="9-linkedin-api-by-tomquirk">9. <code>linkedin-api</code> by tomquirk</h3>
<p>This one is still popular because developers love getting clean JSON without manually parsing the front-end.</p>
<p>That part is genuinely nice.</p>
<p>The tradeoff is also unchanged: it requires LinkedIn credentials, which means the risk surface is pretty obvious.</p>
<h4 id="linkedin-api-pros"><code>linkedin-api</code> Pros</h4>
<ul>
<li>Clean JSON output.</li>
<li>Better developer experience than raw scraping.</li>
</ul>
<h4 id="linkedin-api-cons"><code>linkedin-api</code> Cons</h4>
<ul>
<li>Requires LinkedIn credentials.</li>
<li>Account suspension risk is real.</li>
<li>Bound by whatever LinkedIn changes upstream.</li>
</ul>
<h3 id="10-linkscrape-by-rosstripi">10. <code>LinkScrape</code> by rosstripi</h3>
<p>LinkScrape is still a narrower project and mostly useful for company-based employee enumeration.</p>
<p>I still think the original write-up had the right instinct here: the focus is useful, but the narrowness limits it.</p>
<h4 id="linkscrape-pros">LinkScrape Pros</h4>
<ul>
<li>Good for targeted company scraping.</li>
<li>Useful if employee enumeration is your exact use case.</li>
</ul>
<h4 id="linkscrape-cons">LinkScrape Cons</h4>
<ul>
<li>Narrow scope.</li>
<li>Session handling is weaker than more mature tools.</li>
<li>Smaller community means slower troubleshooting.</li>
</ul>
<h3 id="11-linkedin-scraper-by-tufayellus">11. <code>linkedin-scraper</code> by TufayelLUS</h3>
<p>This remains one of the more detailed profile-oriented open-source options, especially if you care about skills and endorsements.</p>
<p>That makes it interesting for recruiting experiments and talent analysis. It does not change the maintenance burden.</p>
<h4 id="linkedin-scraper-pros"><code>linkedin-scraper</code> Pros</h4>
<ul>
<li>More detailed profile extraction than some narrower repos.</li>
<li>Can handle profiles, jobs, and companies.</li>
</ul>
<h4 id="linkedin-scraper-cons"><code>linkedin-scraper</code> Cons</h4>
<ul>
<li>Cookie/session dependence is fragile.</li>
<li>Smaller community.</li>
<li>No built-in scale infrastructure.</li>
</ul>
<h2 id="browser-extension-linkedin-scrapers">Browser extension LinkedIn scrapers</h2>
<p>This category is still the easiest place for solo operators to get started and the easiest place to make a mess.</p>
<p>Extensions feel safe because they are visible. That is mostly emotional. Not technical.</p>
<h3 id="12-evaboot">12. Evaboot</h3>
<p>Evaboot is still active in 2026 and still tightly tied to Sales Navigator export workflows.</p>
<p>Its pricing is now very clearly credit-based, and the low-end entry point is still attractive. The official pricing page shows credits starting from <strong>$9</strong>.</p>
<p>If you already live in Sales Navigator and mainly want cleaner exports plus email enrichment, Evaboot still makes sense.</p>
<h4 id="evaboot-pros">Evaboot Pros</h4>
<ul>
<li>Clear use case.</li>
<li>Easy to understand.</li>
<li>Good documentation.</li>
</ul>
<h4 id="evaboot-cons">Evaboot Cons</h4>
<ul>
<li>Requires Sales Navigator.</li>
<li>Credit math can become annoying at scale.</li>
<li>Limited beyond export and enrichment.</li>
</ul>
<h4 id="evaboot-pricing">Evaboot Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>No full free plan, low-entry credit purchases</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>Starts at $9</td>
</tr>
<tr>
<td>Higher Usage</td>
<td>Credit-based, scales with volume</td>
</tr>
</tbody>
</table>
<h3 id="13-meetalfred">13. MeetAlfred</h3>
<p>MeetAlfred still leans more toward omnichannel outreach than true scraping.</p>
<p>That was true before, and it is still true now.</p>
<p>If you want campaigns, sequences, and multichannel activity, it can work. If you want a data extraction product first, I would look elsewhere.</p>
<h4 id="meetalfred-pros">MeetAlfred Pros</h4>
<ul>
<li>Simple UI.</li>
<li>Multiple search and outreach workflows.</li>
</ul>
<h4 id="meetalfred-cons">MeetAlfred Cons</h4>
<ul>
<li>More outreach tool than scraper.</li>
<li>Export is not really the center of gravity.</li>
</ul>
<h4 id="meetalfred-pricing">MeetAlfred Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>14-day free trial</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$59/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$99/user/mo</td>
</tr>
</tbody>
</table>
<h3 id="14-octopus-crm">14. Octopus CRM</h3>
<p>Octopus CRM is still one of the cheaper options in the category and still feels like an automation extension first, scraper second.</p>
<p>That is not a criticism. It is just the product reality.</p>
<h4 id="octopus-crm-pros">Octopus CRM Pros</h4>
<ul>
<li>Cheap.</li>
<li>Easy enough for non-technical users.</li>
<li>Good if your main goal is lightweight LinkedIn automation.</li>
</ul>
<h4 id="octopus-crm-cons">Octopus CRM Cons</h4>
<ul>
<li>Data depth is limited.</li>
<li>More about workflow automation than high-quality extraction.</li>
</ul>
<h4 id="octopus-crm-pricing">Octopus CRM Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>7-day free trial</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$9.99/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$39.99/mo</td>
</tr>
</tbody>
</table>
<h3 id="15-waalaxy">15. Waalaxy</h3>
<p>Waalaxy is still active and the pricing has changed quite a bit from the older imported version. The current pricing page shows entry plans around <strong>$16/month</strong>, then <strong>$32</strong> and <strong>$55</strong> tiers depending on the feature set and billing cycle.</p>
<p>My actual opinion on Waalaxy has not changed much. It is approachable. It is also pretty light on real data extraction depth.</p>
<h4 id="waalaxy-pros">Waalaxy Pros</h4>
<ul>
<li>Beginner-friendly.</li>
<li>Cheap entry point.</li>
<li>Good for lightweight outreach workflows.</li>
</ul>
<h4 id="waalaxy-cons">Waalaxy Cons</h4>
<ul>
<li>Data richness is limited.</li>
<li>Better for messaging than for durable enrichment.</li>
</ul>
<h4 id="waalaxy-pricing">Waalaxy Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Trial/free entry exists</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>~$16/mo</td>
</tr>
<tr>
<td>Mid-tier</td>
<td>~$32/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>~$55/mo</td>
</tr>
</tbody>
</table>
<h3 id="16-dux-soup">16. Dux-Soup</h3>
<p>Dux-Soup is still very much alive. Pricing still starts around <strong>$14.99/month</strong>, with annual pricing taking it lower.</p>
<p>It is still a sensible choice if you want simple LinkedIn automation without getting buried under a more complex product.</p>
<h4 id="dux-soup-pros">Dux-Soup Pros</h4>
<ul>
<li>Affordable.</li>
<li>Onboarding is decent.</li>
<li>Mature enough that the product does not feel experimental.</li>
</ul>
<h4 id="dux-soup-cons">Dux-Soup Cons</h4>
<ul>
<li>Browser dependency is still a pain.</li>
<li>LinkedIn account risk still exists, regardless of marketing copy.</li>
<li>More outreach than data platform.</li>
</ul>
<h4 id="dux-soup-pricing">Dux-Soup Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>14-day free trial</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$14.99/mo</td>
</tr>
<tr>
<td>Higher Tiers</td>
<td>~$55 to $99/mo</td>
</tr>
</tbody>
</table>
<h2 id="lead-generation-and-email-discovery-tools">Lead generation and email discovery tools</h2>
<p>By this point, it should be obvious that a lot of "LinkedIn scrapers" are really contact data vendors or outbound tools wearing a LinkedIn-shaped hat.</p>
<p>That is not necessarily bad. It just means you should buy the thing for what it actually does.</p>
<h3 id="17-hunterio">17. Hunter.io</h3>
<p>Hunter.io is still not a LinkedIn scraper in the pure sense. It is an email finding and verification tool.</p>
<p>Still useful. Still better for domain-based contact discovery than for LinkedIn-specific extraction.</p>
<h4 id="hunterio-pros">Hunter.io Pros</h4>
<ul>
<li>Simple and reliable.</li>
<li>Good email verification.</li>
</ul>
<h4 id="hunterio-cons">Hunter.io Cons</h4>
<ul>
<li>Not a true LinkedIn data tool.</li>
<li>False positives still happen.</li>
</ul>
<h4 id="hunterio-pricing">Hunter.io Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Free plan available</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$34/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$349/mo</td>
</tr>
</tbody>
</table>
<h3 id="18-lusha">18. Lusha</h3>
<p>Lusha is still alive and still popular with sales teams that want extension + API flexibility.</p>
<p>I still hear the same split feedback I heard years ago: people like the convenience, and they complain when the data is wrong.</p>
<p>That is not unique to Lusha. It is just the reality of B2B contact data.</p>
<h4 id="lusha-pros">Lusha Pros</h4>
<ul>
<li>Easy to use.</li>
<li>Good CRM integrations.</li>
<li>Useful extension workflow.</li>
</ul>
<h4 id="lusha-cons">Lusha Cons</h4>
<ul>
<li>Accuracy complaints still come up.</li>
<li>Not really built for raw scraping use cases.</li>
</ul>
<h4 id="lusha-pricing">Lusha Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>50 emails / 5 phone numbers</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$49/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom</td>
</tr>
</tbody>
</table>
<h3 id="19-apolloio">19. Apollo.io</h3>
<p>Apollo is still one of the most commercially useful tools on this entire list, but calling it a LinkedIn scraper is still slightly misleading.</p>
<p>It is a sales engagement and contact database platform. It just overlaps heavily with the same jobs people once tried to solve by scraping LinkedIn manually.</p>
<h4 id="apolloio-pros">Apollo.io Pros</h4>
<ul>
<li>Rich workflow automation.</li>
<li>Strong search filters.</li>
<li>Good for SDR and outbound teams.</li>
</ul>
<h4 id="apolloio-cons">Apollo.io Cons</h4>
<ul>
<li>Data quality is uneven in places.</li>
<li>Gets expensive when you scale seats and usage.</li>
<li>Can encourage a lot of mediocre automation if your team is sloppy.</li>
</ul>
<h4 id="apolloio-pricing">Apollo.io Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>1,200 credits/year</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$59/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$149/user/mo</td>
</tr>
</tbody>
</table>
<h3 id="20-uplead">20. UpLead</h3>
<p>UpLead still appeals to teams that want verified contact data and are willing to trade some volume for cleaner records.</p>
<p>That is still the right way to think about it.</p>
<h4 id="uplead-pros">UpLead Pros</h4>
<ul>
<li>Verification-first model is useful.</li>
<li>Good for teams that hate wasting credits on junk.</li>
</ul>
<h4 id="uplead-cons">UpLead Cons</h4>
<ul>
<li>Lower volume than some competitors.</li>
<li>Price-to-database-size tradeoff can feel rough.</li>
</ul>
<h4 id="uplead-pricing">UpLead Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>7-day trial, 5 credits</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$99/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom</td>
</tr>
</tbody>
</table>
<h3 id="21-lemlist">21. Lemlist</h3>
<p>Lemlist remains more of an outreach platform than a LinkedIn scraping tool.</p>
<p>It is still useful, but you should not buy it expecting it to solve data acquisition at the source.</p>
<h4 id="lemlist-pros">Lemlist Pros</h4>
<ul>
<li>Strong sequencing and personalization.</li>
<li>Good multichannel workflows.</li>
</ul>
<h4 id="lemlist-cons">Lemlist Cons</h4>
<ul>
<li>Mixed customer support feedback remains.</li>
<li>Not a core scraping product.</li>
</ul>
<h4 id="lemlist-pricing">Lemlist Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>14-day free trial</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$39/user/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$159/user/mo</td>
</tr>
</tbody>
</table>
<h3 id="22-snovio">22. Snov.io</h3>
<p>Snov.io still sits in that hybrid bucket of lead generation, outreach, and small CRM functionality.</p>
<p>The original complaint in the imported piece still stands, honestly. For a tool people often mention in LinkedIn workflows, the LinkedIn-native value is not as strong as you might expect.</p>
<h4 id="snovio-pros">Snov.io Pros</h4>
<ul>
<li>Easy onboarding.</li>
<li>Good for all-in-one lightweight outbound.</li>
</ul>
<h4 id="snovio-cons">Snov.io Cons</h4>
<ul>
<li>Not a strong pure LinkedIn extraction product.</li>
<li>Refund policy is still a turnoff for some buyers.</li>
</ul>
<h4 id="snovio-pricing">Snov.io Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>50 credits</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$39/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom</td>
</tr>
</tbody>
</table>
<h2 id="data-aggregation-and-analytics-vendors">Data aggregation and analytics vendors</h2>
<p>This is the category people under-appreciate when they obsess over scraping tools.</p>
<p>If your job is analytics, market mapping, workforce intelligence, or research, you often do <strong>not</strong> want a scraper. You want a vendor that already did the collection and structuring.</p>
<h3 id="23-revelio-labs">23. Revelio Labs</h3>
<p>Revelio Labs is still a serious workforce intelligence platform. Still expensive. Still not for casual users.</p>
<p>The older estimate of <strong>~$85,000/year</strong> is still best treated as directional, because public pricing remains unavailable.</p>
<h4 id="revelio-labs-pros">Revelio Labs Pros</h4>
<ul>
<li>Serious workforce analytics.</li>
<li>Good for benchmarking and labor-market intelligence.</li>
</ul>
<h4 id="revelio-labs-cons">Revelio Labs Cons</h4>
<ul>
<li>Price opacity.</li>
<li>Narrower B2B use case than general enrichment vendors.</li>
</ul>
<h3 id="24-xverum">24. Xverum</h3>
<p>Xverum is still around, still relatively opaque, and still not nearly as transparent as I would like for a buyer trying to compare options.</p>
<h4 id="xverum-pros">Xverum Pros</h4>
<ul>
<li>API-oriented access.</li>
<li>Broad firmographic and profile-style data coverage.</li>
</ul>
<h4 id="xverum-cons">Xverum Cons</h4>
<ul>
<li>Weak pricing transparency.</li>
<li>Harder to validate freshness and user satisfaction.</li>
</ul>
<h3 id="25-coresignal">25. Coresignal</h3>
<p>Coresignal is still active and the official docs still show API subscriptions from <strong>$49/month</strong>, with full datasets starting around <strong>$1,000</strong>.</p>
<p>This remains one of the more credible options if you want structured datasets and are comfortable with the usual freshness tradeoffs.</p>
<h4 id="coresignal-pros">Coresignal Pros</h4>
<ul>
<li>Useful formats and delivery methods.</li>
<li>Good for teams that want datasets or search APIs.</li>
</ul>
<h4 id="coresignal-cons">Coresignal Cons</h4>
<ul>
<li>Freshness complaints still matter.</li>
<li>"Real-time" can be slower than buyers expect.</li>
</ul>
<h4 id="coresignal-pricing">Coresignal Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>Trial credits available</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$49/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$1,500/mo</td>
</tr>
<tr>
<td>Datasets</td>
<td>From ~$1,000</td>
</tr>
</tbody>
</table>
<h3 id="26-talentneuron">26. TalentNeuron</h3>
<p>TalentNeuron is still workforce analytics software first, LinkedIn-adjacent data tool second.</p>
<p>If you are doing hiring strategy, geography analysis, and labor market planning, it can be useful. If you are trying to build outbound lists, it is the wrong category.</p>
<h4 id="talentneuron-pros">TalentNeuron Pros</h4>
<ul>
<li>Good for strategic workforce planning.</li>
<li>Combines multiple data sources.</li>
</ul>
<h4 id="talentneuron-cons">TalentNeuron Cons</h4>
<ul>
<li>Weak self-serve accessibility.</li>
<li>Not built for flexible downloads the way many buyers want.</li>
</ul>
<h3 id="27-seekout">27. SeekOut</h3>
<p>SeekOut is still strong for recruiting, especially in North America.</p>
<p>I still would not stretch it into use cases it is not built for.</p>
<h4 id="seekout-pros">SeekOut Pros</h4>
<ul>
<li>Strong recruiting filters.</li>
<li>Good search experience.</li>
</ul>
<h4 id="seekout-cons">SeekOut Cons</h4>
<ul>
<li>Narrower geography and use case focus.</li>
<li>Less useful outside recruiting.</li>
</ul>
<h4 id="seekout-pricing">SeekOut Pricing</h4>
<p>Public pricing is still not clearly listed. Market references still put plans starting around <strong>$499/month</strong>.</p>
<h3 id="28-entelo">28. Entelo</h3>
<p>Entelo remains in the predictive recruiting bucket. Useful in that lane. Not particularly compelling outside it.</p>
<h4 id="entelo-pros">Entelo Pros</h4>
<ul>
<li>Predictive hiring workflows.</li>
<li>ATS-friendly.</li>
</ul>
<h4 id="entelo-cons">Entelo Cons</h4>
<ul>
<li>Limited scale and flexibility versus broader data platforms.</li>
</ul>
<h2 id="no-code-linkedin-scrapers">No-code LinkedIn scrapers</h2>
<p>These are for the people who want extraction without writing code.</p>
<p>That is a valid need. It is also where buyers sometimes confuse "easy setup" with "good long-term decision".</p>
<h3 id="29-octoparse">29. Octoparse</h3>
<p>Octoparse is still alive and the current pricing page shows <strong>$69/month</strong> for Standard and <strong>$249/month</strong> for Professional, with a free plan.</p>
<p>The original article liked the point-and-click interface. I still do too. But LinkedIn remains one of the harder places for these generic no-code scrapers to work reliably.</p>
<h4 id="octoparse-pros">Octoparse Pros</h4>
<ul>
<li>Good no-code UX.</li>
<li>Multi-purpose beyond LinkedIn.</li>
<li>Free tier is useful for testing.</li>
</ul>
<h4 id="octoparse-cons">Octoparse Cons</h4>
<ul>
<li>Generic scraper limitations show up fast on LinkedIn.</li>
<li>Dynamic page handling is still where things get annoying.</li>
</ul>
<h4 id="octoparse-pricing">Octoparse Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>10 tasks</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$69/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>$249/mo</td>
</tr>
</tbody>
</table>
<h3 id="30-bright-data">30. Bright Data</h3>
<p>Bright Data is still more infrastructure than turnkey LinkedIn scraping solution.</p>
<p>That is why technical teams like it and non-technical buyers often get frustrated.</p>
<p>If you want proxies, scraping infrastructure, and dataset options, it is still one of the strongest vendors around. If you want "just give me leads," this is too much machinery.</p>
<h4 id="bright-data-pros">Bright Data Pros</h4>
<ul>
<li>Strong proxy network.</li>
<li>Serious scraping infrastructure.</li>
<li>Useful if you are building your own stack.</li>
</ul>
<h4 id="bright-data-cons">Bright Data Cons</h4>
<ul>
<li>Complex setup.</li>
<li>Can get expensive fast.</li>
<li>Better for operators than for regular sales teams.</li>
</ul>
<h4 id="bright-data-pricing">Bright Data Pricing</h4>
<p>The older article's point still stands: pricing is complicated and highly segmented. Expect starting points in the <strong>~$500/month</strong> range for meaningful infrastructure usage.</p>
<h3 id="31-parsehub">31. ParseHub</h3>
<p>ParseHub is still one of the more approachable no-code tools, and I still think the point-and-click interface is its best feature.</p>
<p>I would still not choose it as my first LinkedIn-specific option because LinkedIn's defenses make generic scrapers flaky here.</p>
<h4 id="parsehub-pros">ParseHub Pros</h4>
<ul>
<li>Friendly interface.</li>
<li>Good for general web extraction tasks.</li>
</ul>
<h4 id="parsehub-cons">ParseHub Cons</h4>
<ul>
<li>LinkedIn anti-bot measures are still a problem.</li>
<li>Troubleshooting failed projects can get tedious.</li>
</ul>
<h4 id="parsehub-pricing">ParseHub Pricing</h4>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Details</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>200 pages per run window</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>$189/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Custom</td>
</tr>
</tbody>
</table>
<h3 id="32-importio">32. Import.io</h3>
<p>Import.io is still a no-code-to-semi-technical extraction platform rather than a LinkedIn-specialist tool.</p>
<p>The imported article was right to note that pricing is still annoyingly opaque.</p>
<h4 id="importio-pros">Import.io Pros</h4>
<ul>
<li>Flexible.</li>
<li>Good for scheduled extraction and downstream integrations.</li>
</ul>
<h4 id="importio-cons">Import.io Cons</h4>
<ul>
<li>Not LinkedIn-specific.</li>
<li>Manual intervention is still common for difficult pages.</li>
</ul>
<h2 id="1-iscraper-dead-and-worth-remembering">+1. iScraper, dead and worth remembering</h2>
<p>iScraper is the "+1" because dead tools teach more than live ones sometimes.</p>
<p><strong>2026 update: iScraper is dead.</strong> LinkedIn sued it.</p>
<p>I am including it because too many roundup articles quietly delete failed operators and then pretend the risk was theoretical all along. It was not.</p>
<p>If you are building a company that depends on LinkedIn-derived data, the right question is not just "does this tool work today?" The right question is also:</p>
<ul>
<li>what happens if LinkedIn notices?</li>
<li>what happens if they sue?</li>
<li>what happens to my customers, my data, and my code if this blows up?</li>
</ul>
<p>iScraper is what happens when those questions stop being abstract.</p>
<h4 id="iscraper-pros">iScraper Pros</h4>
<ul>
<li>Historically, it solved a real demand.</li>
</ul>
<h4 id="iscraper-cons">iScraper Cons</h4>
<ul>
<li>Dead.</li>
<li>Sued by LinkedIn.</li>
<li>Perfect example of why "working" and "durable" are not the same thing.</li>
</ul>
<h2 id="comparison-table">Comparison table</h2>
<p>Because this article compares more than three tools, here is the table I wish more people started with.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th>Data Quality</th>
<th>Pricing</th>
<th>Ease of Use</th>
<th>API / Integration</th>
<th>Durability</th>
<th>Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>NinjaPear</td>
<td>Competitive intel without LinkedIn risk</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.40/5</td>
</tr>
<tr>
<td>PhantomBuster</td>
<td>Automation workflows</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.00/5</td>
</tr>
<tr>
<td>People Data Labs</td>
<td>Enrichment/database</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐☆☆</td>
<td>3.40/5</td>
</tr>
<tr>
<td>Evaboot</td>
<td>Sales Nav export</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.20/5</td>
</tr>
<tr>
<td>Coresignal</td>
<td>Datasets/API</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.60/5</td>
</tr>
<tr>
<td>Octoparse</td>
<td>No-code scraping</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>2.60/5</td>
</tr>
<tr>
<td>Dux-Soup</td>
<td>Simple LinkedIn automation</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>2.80/5</td>
</tr>
<tr>
<td>Apollo.io</td>
<td>Sales engagement + contact data</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.60/5</td>
</tr>
</tbody>
</table>
<p>My blunt take:</p>
<ul>
<li>If you want <strong>LinkedIn automation</strong>, PhantomBuster or Dux-Soup are still serviceable.</li>
<li>If you want <strong>LinkedIn export from Sales Navigator</strong>, Evaboot is still one of the cleaner options.</li>
<li>If you want <strong>database/API enrichment</strong>, People Data Labs and Coresignal are the more relevant comparisons.</li>
<li>If you want <strong>the business outcome without LinkedIn liability</strong>, NinjaPear is the more interesting product category.</li>
</ul>
<h2 id="how-do-i-find-the-best-linkedin-scraper-for-me">How do I find the best LinkedIn scraper for me?</h2>
<p>30+ options is too many unless you simplify the decision.</p>
<p>Here is the only framework I would use now.</p>
<h3 id="technical-proficiency">Technical proficiency</h3>
<p>If you are a developer, you can still make open-source tools work. The question is whether you should.</p>
<p>If you're non-technical, browser extensions and no-code tools will get you to first output faster. They will not necessarily get you to a durable workflow.</p>
<h3 id="data-depth-and-freshness">Data depth and freshness</h3>
<p>This is still the most under-rated filter.</p>
<p>Ask these questions:</p>
<ul>
<li>Is the data fetched on demand or from a prebuilt database?</li>
<li>Can I control freshness?</li>
<li>What fields actually come back?</li>
<li>What happens when the source changes?</li>
</ul>
<p>A lot of buyers compare shiny landing pages and never ask the questions that matter.</p>
<h3 id="purpose">Purpose</h3>
<p>This is where most people screw up.</p>
<p>If your real goal is <strong>outreach</strong>, buy an outreach product.
If your real goal is <strong>enrichment</strong>, buy an enrichment API.
If your real goal is <strong>competitive intel</strong>, buy a competitive intel platform.</p>
<p>Do not buy a Chrome extension and expect it to become a data moat.</p>
<h3 id="budget">Budget</h3>
<p>Open source is cheapest in cash and most expensive in founder attention.</p>
<p>Enterprise data vendors are expensive in cash and often cheap in internal engineering time.</p>
<p>The wrong middle ground is paying a modest monthly fee for a tool that creates hidden downstream chaos.</p>
<p>I've done that. It feels cheap. It is not cheap.</p>
<h3 id="ease-of-use">Ease of use</h3>
<p>Waalaxy, Evaboot, and ParseHub are easy to get started with.</p>
<p>That matters. But ease of use on day one is not the same as ease of operating at month six.</p>
<h3 id="scalability">Scalability</h3>
<p>If this is becoming part of a real workflow, think about:</p>
<ul>
<li>API access</li>
<li>export formats</li>
<li>CRM sync</li>
<li>rate limits</li>
<li>whether your workflow depends on a human browser session being open</li>
</ul>
<p>That last one sounds stupid until it breaks a pipeline you thought was automated.</p>
<h2 id="is-linkedin-scraping-legal">Is LinkedIn scraping legal?</h2>
<p>Here is the narrow answer first.</p>
<p><strong>Public scraping is not automatically criminal after hiQ.</strong></p>
<p>Here is the useful operator answer.</p>
<p><strong>That does not mean building a business on LinkedIn-derived data is safe.</strong></p>
<p>I want to be very precise here because people love flattening this into internet-lawyer sludge.</p>
<p>The best recent write-up on this is the Nubela post <strong><a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">Is Scraping LinkedIn Legal in 2026? (I Was Sued by LinkedIn)</a></strong>. The sentence that matters most is this one:</p>
<blockquote>
<p>public scraping may be outside one narrow theory of criminal or statutory liability, but that does not make your company safe from LinkedIn.</p>
</blockquote>
<p>That is the whole thing.</p>
<p>The original version of this article was too casual about legal risk. That was a mistake.</p>
<p>What matters in 2026 is not just whether a court says public scraping is automatically criminal. What matters is:</p>
<ul>
<li>LinkedIn's Terms of Service</li>
<li>breach-of-contract exposure</li>
<li>civil claims</li>
<li>customer notification risk</li>
<li>data deletion risk</li>
<li>derivative-data deletion risk</li>
<li>discovery hell</li>
</ul>
<p>That last one sounds abstract until you have to deal with it.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/dataanalysis</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/3-ma</span>
<span style="color:#878a8c;">· ▲ 57</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I looked into this a while back. The law is unclear since it's public data and the law is different in different global regions. You don't need to be in breach of the law to break terms and conditions and get perma banned from a platform though. The best way to limit the risk is to use long timeouts between calls</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/dataanalysis/comments/1kkv5t2/can_i_legally_scrape_data_from_linkedin_indeed/mrxl17x/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That Reddit comment gets one thing exactly right: <strong>legal</strong> and <strong>safe</strong> are not synonyms.</p>
<p>A few practical liability notes:</p>
<ul>
<li>If your employees use LinkedIn accounts, you may already be in contract land.</li>
<li>Buying LinkedIn-derived data from a broker does not magically clean the chain of custody.</li>
<li>If a plaintiff asks for deletion of inferred or downstream data, the blast radius gets ugly fast.</li>
<li>If your entire GTM stack depends on LinkedIn-derived workflows, diligence during an acquisition will get uncomfortable.</li>
</ul>
<p>So, is LinkedIn scraping legal?</p>
<p><strong>Narrow legal answer:</strong> sometimes public scraping may be defensible.</p>
<p><strong>Business answer:</strong> I would not call it durable.</p>
<h2 id="my-recommendation">My recommendation</h2>
<p>I have two recommendations now, not one.</p>
<h3 id="if-you-still-want-a-linkedin-scraper">If you still want a LinkedIn scraper</h3>
<p>Pick based on your actual job:</p>
<ul>
<li><strong>PhantomBuster</strong> for flexible automation.</li>
<li><strong>Evaboot</strong> for Sales Navigator export.</li>
<li><strong>People Data Labs</strong> or <strong>Coresignal</strong> for API/database workflows.</li>
</ul>
<p>That is the cleanest version of the old recommendation set.</p>
<h3 id="if-you-want-the-commercial-outcome-without-the-linkedin-liability">If you want the commercial outcome without the LinkedIn liability</h3>
<p>Use <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>.</p>
<p>This is the part I feel strongest about in 2026.</p>
<p>Most teams do not actually need LinkedIn scraping. They need:</p>
<ul>
<li>better prospecting inputs</li>
<li>fresher account signals</li>
<li>customer and competitor mapping</li>
<li>person and company enrichment</li>
<li>work emails</li>
<li>a reason to reach out now, not six weeks from now</li>
</ul>
<p>NinjaPear gives you that without building on LinkedIn data.</p>
<p>That matters more than people think.</p>
<p>When I was running FluxoMetric, I burned ~4K/month on tools that gave me worse signal than a decent analyst with a browser and patience. The issue was never lack of data. It was that the data was blurry, stale, or legally awkward. NinjaPear is much closer to what I wish I had back then: a direct path to competitive intelligence and prospecting signal, not a fragile dance around someone else's platform rules.</p>
<h2 id="final-thoughts">Final thoughts</h2>
<p>The original article had the right instinct: there are a lot of options, and they are not interchangeable.</p>
<p>The 2026 update is simpler.</p>
<p><strong>LinkedIn scrapers still exist. Several are still useful. But the category has aged badly if you care about business durability.</strong></p>
<p>That is the update.</p>
<p>If you still need a LinkedIn scraper, use the table above and buy the narrowest tool that matches your use case.</p>
<p>If you are tired of building GTM workflows on top of legal gray zones, Chrome extensions, and somebody else's tolerance threshold, try NinjaPear instead. Start with the free trial, test a few real accounts, and see if you can get the outcome you wanted from LinkedIn without touching LinkedIn at all.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="is-it-possible-to-scrape-data-from-linkedin">Is it possible to scrape data from LinkedIn?</h4>
<p>Yes. Technically, it is still very possible. That has never been the hard part.</p>
<h4 id="what-is-the-safest-linkedin-scraper">What is the safest LinkedIn scraper?</h4>
<p>There is no magic safe scraper. There are only different tradeoffs between convenience, account risk, legal exposure, and durability.</p>
<h4 id="which-linkedin-scraper-is-best-for-developers">Which LinkedIn scraper is best for developers?</h4>
<p>Historically, Proxycurl was the strongest API-first answer, but it has been sunset. In 2026, developers should separate the problem into two parts: if you truly need LinkedIn scraping, use a specialized live vendor. If you need B2B intelligence outcomes, use NinjaPear instead.</p>
<h4 id="is-proxycurl-still-available">Is Proxycurl still available?</h4>
<p>No. Proxycurl API has been sunset.</p>
<h4 id="what-replaced-proxycurl">What replaced Proxycurl?</h4>
<p>The founder behind Proxycurl is now building NinjaPear, but NinjaPear is <strong>not</strong> a LinkedIn scraper replacement in the literal sense. It is a better answer for teams that want B2B data, prospecting, and competitive intelligence without depending on LinkedIn-derived data.</p>
<h4 id="what-happened-to-iscraper">What happened to iScraper?</h4>
<p>It is dead and was sued by LinkedIn.</p>
<h4 id="can-i-avoid-linkedin-scraping-entirely">Can I avoid LinkedIn scraping entirely?</h4>
<p>Yes, and for more teams than you think, you probably should. If your real need is customer intel, competitor monitoring, company enrichment, employee search, or work email lookup, a non-LinkedIn platform like NinjaPear can get you there with a lot less baggage.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ I Built a Lemlist Clone App That Personalizes My Email List at Scale ]]></title>
        <description><![CDATA[ Find out how I created a Lemlist clone for bulk email personalization in 8 steps. Generate automated personalized emails at scale. ]]></description>
        <link>https://nubela.co/blog/build-lemlist-clone-app-personalize-email-list/</link>
        <guid isPermaLink="false">671080cab52061000188ad57</guid>
        <category><![CDATA[ personalized email lists ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Tue, 19 Nov 2024 12:35:03 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Generic emails are a one way ticket to the spam folder. But let’s face it, personalizing hundreds, or even thousands, of emails manually is tough work.</p><p>As a developer, I love solving problems like this. Instead of relying on pre-built tools like Lemlist, I will build my own Lemlist clone; a fully customizable app that automates outreach while crafting personalized emails. And better yet, I will show you how I did it, step-by-step.&nbsp;</p><p>This guide is perfect for fellow developers with a knack for coding. If you're up for the challenge, dive right in, though fair warning, it might get a little technical along the way. And for the seasoned pros out there, the <a href="https://github.com/nubelaco/use-case-examples/tree/main/email-personalization?ref=nubela.co"><u>full source code</u></a> is ready and waiting for you to build your Lemlist clone app!</p><p>In this tutorial, we’ll cover:</p><ul><li>A quick video demo</li><li>App Features</li><li>Prerequisites</li><li>Creating the app (with guided code snippets)</li><li>Using OpenAI for personalized email generation (including code walkthroughs)</li></ul><p>The final result result looks something like this:&nbsp;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/Oct-31-202415-13-521-ezgif.com-optimize.gif" class="kg-image" alt="Quick Demo for the Lemlist like App" loading="lazy" width="1210" height="748"><figcaption><span style="white-space: pre-wrap;">Application Demo </span></figcaption></figure><h2 id="application-features">Application Features </h2><h2 id="application-features-1">Application Features </h2><p>The app has more functionality than what meets the eye. With this Lemlist Clone app, you can:</p><ul><li><strong>Identify and Track Leads:</strong> Manage and track multiple Professional Social Network profiles for targeted lead generation.</li><li><strong>Enrich Lead Data:</strong> Enhance lead profiles using Proxycurl’s API for deeper insights.</li><li><strong>Generate Personalized Emails:</strong> Create unique, personalized emails for multiple leads with one click.</li><li><strong>Review and Copy Easily</strong>: Quickly view and copy generated emails in a gallery layout.</li><li><strong>Save Leads in Local Storage:</strong> Preserve leads in local storage to avoid data loss on refresh.</li><li><strong>Potential for Direct Integration with Email Platforms</strong>: While this isn’t fully implemented, the app could be extended to integrate with the Gmail API or another email provider, allowing users to directly create drafts without needing to copy-paste.</li></ul><h2 id="prerequisites">Prerequisites</h2><p>To get started, make sure you have:</p><ul><li>Node v18+</li><li>A <a href="http://nubela.co/?ref=nubela.co"><u>Proxycurl API</u></a> key&nbsp;</li><li>An <a href="https://openai.com/index/openai-api/?ref=nubela.co"><u>OpenAI API</u></a> key for generating email content that’s unique and engaging.</li><li>Familiarity with <a href="https://react.dev/?ref=nubela.co"><u>React.js</u></a> &amp; <a href="https://nextjs.org/?ref=nubela.co"><u>Next.js</u></a>.</li><li>Familiarity with Tailwind CSS.</li></ul><p>Now that we've discussed the basics, let's get straight to it. </p><h2 id="how-to-build-a-lemlist-clone-app">How to Build a Lemlist Clone App</h2><h3 id="step-1-register-for-a-proxycurl-account"><strong>Step 1: Register for a </strong><a href="https://nubela.co/proxycurl/?ref=nubela.co" rel="noreferrer"><strong>Proxycurl</strong></a><strong> account</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/Screenshot-2024-11-13-at-18.08.37.png" class="kg-image" alt="Proxycurl Landing Page" loading="lazy" width="2000" height="1133"><figcaption><span style="white-space: pre-wrap;">Proxycurl Landing Page</span></figcaption></figure><p>Proxycurl is a data enrichment company offering APIs that pull various data such as person data, company data, contact info, and more. You will need a <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co"><u>Proxycurl account</u></a> to get your hands on a unique API key.&nbsp; Its role here is to pull data from Professional Social Network profiles to inform your personalized emails. Simply sign up and access your <a href="https://nubela.co/proxycurl/dashboard/proxycurl-api/api-key/?ref=nubela.co"><u>Dashboard</u></a> to get the bearer token.</p><p>What’s more, you get free credits upon <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co" rel="noreferrer">signing up</a>.</p><ul><li>100 free credits if you sign up with a work email</li><li>10 credits for personal email</li></ul><h3 id="step-2-create-a-new-nextjs-project">Step 2: Create a New Next.js Project</h3><p>Start by setting up a new project in Next.js.</p><pre><code>npx create-next-app@latest personalize-email
cd personalize-email &amp;&amp; npm run dev
</code></pre><p>Then, add the following packages:</p><pre><code>npx shadcn@latest add table input button checkbox sheet textarea dropdown-menu dialog card     
npm install @tanstack/react-table openai
</code></pre><p>If you encounter an error, try using these specific versions:</p><pre><code class="language-json">    "next": "14.2.13",
    "react": "^18",
    "react-dom": "^18",
</code></pre>
<h3 id="step-3-build-a-lead-management-table">Step 3: Build a Lead Management Table</h3><p>To make things efficient, we’ll use the Data Table from shadcn to create a structured view for displaying leads. The table will be configured to show each lead’s full name, occupation, country, and Professional Social Network profile URL.</p><pre><code class="language-js">export const columns = [
  {
    id: "select",
    header: ({ table }) =&gt; (
      &lt;Checkbox
        checked={
          table.getIsAllPageRowsSelected() ||
          (table.getIsSomePageRowsSelected() &amp;&amp; "indeterminate")
        }
        onCheckedChange={(value) =&gt; table.toggleAllPageRowsSelected(!!value)}
        aria-label="Select all"
      /&gt;
    ),
    cell: ({ row }) =&gt; (
      &lt;Checkbox
        checked={row.getIsSelected()}
        onCheckedChange={(value) =&gt; row.toggleSelected(!!value)}
        aria-label="Select row"
      /&gt;
    ),
    enableSorting: false,
    enableHiding: false,
  },
  {
    accessorKey: "full_name",
    header: "Full Name",
    cell: ({ row }) =&gt; (
      &lt;div className="capitalize"&gt;{row.getValue("full_name")}&lt;/div&gt;
    ),
  },
  {
    accessorKey: "occupation",
    header: "Occupation",
    cell: ({ row }) =&gt; (
      &lt;div className="capitalize"&gt;{row.getValue("occupation")}&lt;/div&gt;
    ),
  },
  {
    accessorKey: "country_full_name",
    header: "Country",
    cell: ({ row }) =&gt; (
      &lt;div className="capitalize"&gt;{row.getValue("country_full_name")}&lt;/div&gt;
    ),
  },
  {
    accessorKey: "public_identifier",
    header: "Professional Social Network URL",
    cell: ({ row }) =&gt; (
      &lt;div&gt;{`https://www.professionalsocialnetwork.com/in/${row.getValue(
        "public_identifier",
      )}`}&lt;/div&gt;
    ),
  },
  {
    id: "actions",
    enableHiding: false,
    cell: ({ row, table }) =&gt; {
      return (
        &lt;DropdownMenu&gt;
          &lt;DropdownMenuTrigger asChild&gt;
            &lt;Button variant="ghost" className="p-0 w-8 h-8"&gt;
              &lt;span className="sr-only"&gt;Open menu&lt;/span&gt;
              &lt;MoreHorizontal className="w-4 h-4" /&gt;
            &lt;/Button&gt;
          &lt;/DropdownMenuTrigger&gt;
          &lt;DropdownMenuContent align="end"&gt;
            &lt;DropdownMenuLabel&gt;Actions&lt;/DropdownMenuLabel&gt;
            &lt;DropdownMenuItem&gt;&lt;/DropdownMenuItem&gt;
            &lt;DropdownMenuSeparator /&gt;
          &lt;/DropdownMenuContent&gt;
        &lt;/DropdownMenu&gt;
      );
    },
  },
];
</code></pre>
<p>Then create <code>app/components/Leads.jsx</code> and import the column there. We will also hold the state of the app in this component.</p><pre><code class="language-jsx">"use client";

import Image from "next/image";
import React, { useState, useEffect } from "react";
import {
  flexRender,
  getCoreRowModel,
  getFilteredRowModel,
  getPaginationRowModel,
  getSortedRowModel,
  useReactTable,
} from "@tanstack/react-table";
import {  Mail, Plus, } from "lucide-react";
import { Button } from "@/components/ui/button";
import { columns } from './columns';


function Leads() {
  const [data, setData] = useState([]);
  const [sorting, setSorting] = useState([]);
  const [columnFilters, setColumnFilters] = useState([]);
  const [columnVisibility, setColumnVisibility] = useState({});
  const [rowSelection, setRowSelection] = useState({});

  const table = useReactTable({
    data,
    columns,
    onSortingChange: setSorting,
    onColumnFiltersChange: setColumnFilters,
    getCoreRowModel: getCoreRowModel(),
    getPaginationRowModel: getPaginationRowModel(),
    getSortedRowModel: getSortedRowModel(),
    getFilteredRowModel: getFilteredRowModel(),
    onColumnVisibilityChange: setColumnVisibility,
    onRowSelectionChange: setRowSelection,
    state: {
      sorting,
      columnFilters,
      columnVisibility,
      rowSelection,
    },
  });

  return (
    &lt;div className="w-full max-w-5xl"&gt;
      &lt;div className="flex flex-col justify-between items-start py-4 space-y-4 pt-md-8 sm:flex-row sm:items-center sm:space-y-0"&gt;
        &lt;div className="flex gap-2 items-start"&gt;
          &lt;div className="flex items-center"&gt;
            &lt;Image
              src="/email-logo-dummy.svg"
              alt="Email logo"
              width={24}
              height={24}
              className="text-blue-600"
            /&gt;
          &lt;/div&gt;
          &lt;div className="flex flex-col items-start"&gt;
            &lt;span className="font-semibold text-blue-600"&gt;
              Email Personalization
            &lt;/span&gt;
            &lt;span className="text-xs text-gray-500"&gt;
              By
              &lt;a
                href="https://nubela.co/proxycurl"
                target="_blank"
                rel="noopener noreferrer"
                className="underline ms-1"
              &gt;
                Proxycurl
              &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div className="flex flex-col gap-2 w-full sm:flex-row sm:gap-4 sm:w-auto"&gt;
          &lt;Button variant="outline" className="w-full sm:w-auto"&gt;
            &lt;Plus className="mr-2 w-4 h-4" /&gt; Add Leads
          &lt;/Button&gt;
          &lt;Button className="w-full sm:w-auto"&gt;
            &lt;Mail className="mr-2 w-4 h-4" /&gt; Generate all personalized email
          &lt;/Button&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div className="rounded-md border"&gt;
        &lt;div className="overflow-x-auto"&gt;
          &lt;Table className="w-full whitespace-nowrap"&gt;
            &lt;TableHeader&gt;
              {table.getHeaderGroups().map((headerGroup) =&gt; (
                &lt;TableRow key={headerGroup.id}&gt;
                  {headerGroup.headers.map((header) =&gt; {
                    return (
                      &lt;TableHead key={header.id} className="px-2"&gt;
                        {header.isPlaceholder
                          ? null
                          : flexRender(
                              header.column.columnDef.header,
                              header.getContext(),
                            )}
                      &lt;/TableHead&gt;
                    );
                  })}
                &lt;/TableRow&gt;
              ))}
            &lt;/TableHeader&gt;
            &lt;TableBody&gt;
              {table.getRowModel().rows?.length ? (
                table.getRowModel().rows.map((row) =&gt; (
                  &lt;TableRow
                    key={row.id}
                    data-state={row.getIsSelected() &amp;&amp; "selected"}
                  &gt;
                    {row.getVisibleCells().map((cell) =&gt; (
                      &lt;TableCell key={cell.id} className="px-2"&gt;
                        {flexRender(
                          cell.column.columnDef.cell,
                          cell.getContext(),
                        )}
                      &lt;/TableCell&gt;
                    ))}
                  &lt;/TableRow&gt;
                ))
              ) : (
                &lt;TableRow&gt;
                  &lt;TableCell
                    colSpan={columns.length}
                    className="h-24 text-center"
                  &gt;
                    &lt;div className="flex flex-col justify-center items-center py-16 h-full"&gt;
                      &lt;p className="text-gray-500"&gt;
                        No leads found. Add Professional Social Network profile URLs to start
                        personalizing emails.
                      &lt;/p&gt;

                      &lt;Button variant="outline" className="mt-4"&gt;
                        &lt;Plus className="w-4 h-4" /&gt; Add Leads
                      &lt;/Button&gt;
                    &lt;/div&gt;
                  &lt;/TableCell&gt;
                &lt;/TableRow&gt;
              )}
            &lt;/TableBody&gt;
          &lt;/Table&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div className="flex justify-end items-center py-4 space-x-2"&gt;
        &lt;div className="flex-1 text-sm text-muted-foreground"&gt;
          {table.getFilteredSelectedRowModel().rows.length} of{" "}
          {table.getFilteredRowModel().rows.length} row(s) selected.
        &lt;/div&gt;
        &lt;div className="space-x-2"&gt;
          &lt;Button
            variant="outline"
            size="sm"
            onClick={() =&gt; table.previousPage()}
            disabled={!table.getCanPreviousPage()}
          &gt;
            Previous
          &lt;/Button&gt;
          &lt;span className="text-sm text-gray-500"&gt;
            Page {table.getState().pagination.pageIndex + 1} of{" "}
            {table.getPageCount()}
          &lt;/span&gt;
          &lt;Button
            variant="outline"
            size="sm"
            onClick={() =&gt; table.nextPage()}
            disabled={!table.getCanNextPage()}
          &gt;
            Next
          &lt;/Button&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
}

export default Leads;
</code></pre><p>The result should look something like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/empty-lead--1-.png" class="kg-image" alt="A created Lead Management Table" loading="lazy" width="2152" height="804"><figcaption><span style="white-space: pre-wrap;">Lead Management Table</span></figcaption></figure><h3 id="step-4-adding-and-enriching-leads">Step 4: Adding and Enriching Leads</h3><p>For ease of input, let’s create a modal to allow users to enter multiple Professional Social Network profile URLs at once.</p><p>Create <code>email-personalization/app/components/Modal.jsx</code></p><pre><code class="language-jsx">import {
  Dialog,
  DialogContent,
  DialogTitle,
} from "@/components/ui/dialog";
import { Textarea } from "@/components/ui/textarea";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";

const Modal = ({ isOpen, setIsOpen, leadsProfile, setLeadsProfile, handleSubmit, isLoading }) =&gt; {
  const hasInput = leadsProfile.trim().length &gt; 0;

  return (
    &lt;Dialog open={isOpen} onOpenChange={setIsOpen}&gt;
      &lt;DialogContent className="p-6 max-w-xl"&gt;
        &lt;DialogTitle className="text-xl font-bold text-gray-800"&gt;
          Import Leads by Professional Social Network Profile URL
        &lt;/DialogTitle&gt;
        &lt;p className="mb-0 text-sm text-gray-500"&gt;
          Accepted format is https://www.professionalsocialnetwork.com/in/[username]
        &lt;/p&gt;
        &lt;p className="mb-0 text-sm text-gray-500"&gt;
          For example &lt;span className="px-2 py-1 bg-gray-100 rounded-md border border-gray-200"&gt;https://www.professionalsocialnetwork.com/in/williamhgates/&lt;/span&gt;
        &lt;/p&gt;

        &lt;div className={cn("space-y-2", "mt-0")}&gt;
          &lt;h2 className="text-base font-semibold text-gray-600"&gt;
            Enter one Professional Social Network Profile URL per line
          &lt;/h2&gt;
          &lt;div className="flex"&gt;
            {hasInput &amp;&amp; (
              &lt;div className="mr-2"&gt;
                {leadsProfile.split("\n").map((_, index) =&gt; (
                  &lt;div key={index} className="py-1 text-xs text-gray-500"&gt;
                    {index + 1}
                  &lt;/div&gt;
                ))}
              &lt;/div&gt;
            )}
            &lt;Textarea
              placeholder="Type your message here."
              value={leadsProfile}
              onChange={(e) =&gt; setLeadsProfile(e.target.value)}
              className="p-2 w-full placeholder-gray-400 text-gray-700 rounded-md border"
            /&gt;
          &lt;/div&gt;
        &lt;/div&gt;

        &lt;div className="flex justify-end items-center space-x-2"&gt;
          &lt;Button variant="outline" onClick={() =&gt; setIsOpen(false)}&gt;
            Cancel
          &lt;/Button&gt;
          &lt;Button className="transition duration-200" onClick={handleSubmit}&gt;
            {isLoading ? "Loading..." : "Submit"}
          &lt;/Button&gt;
        &lt;/div&gt;
      &lt;/DialogContent&gt;
    &lt;/Dialog&gt;
  );
};

export default Modal;

</code></pre><p>Then add these to the <code>app/components/Leads.jsx</code></p><pre><code class="language-jsx">import Modal from "./Modal";

//...rest of code
const [isModalOpen, setIsModalOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const [leadsProfile, setLeadsProfile] = useState("");

const handleSubmit = () =&gt; {};
// function above is a placeholder
const handleAddLeads = () =&gt; {
    setIsModalOpen(true);
};
// add handleAddLeads function to both of the add lead button as an onClick handler
//...existing code

// add this above the last div
    &lt;Modal
        isOpen={isModalOpen}
        setIsOpen={setIsModalOpen}
        leadsProfile={leadsProfile}
        setLeadsProfile={setLeadsProfile}
        handleSubmit={handleSubmit}
        isLoading={isLoading}
    /&gt;
&lt;/div&gt;
</code></pre><p>Then, integrate the modal into Leads.jsx to make it accessible when users click “Add Leads.”</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/profile-modal--1-.png" class="kg-image" alt="Image showing a pop-up in the app for import leads through Professional Social Network Profile URL" loading="lazy" width="1640" height="1062"><figcaption><span style="white-space: pre-wrap;">Importing Leads</span></figcaption></figure><p>The modal allows bulk entry and streamlines data gathering by opening instantly on button click.</p><h3 id="step-5-connecting-api-to-the-user-input">Step 5: Connecting API to the user input</h3><p>Time for Proxycurl to shine. We will use the API to enrich Professional Social Network profiles with minimal effort. Pull relevant details directly from Professional Social Network profiles, adding more context to each lead. </p><p>Add function below to <code>app/components/Leads.jsx</code></p><pre><code class="language-jsx">const handleSaveRecentLeads = (profiles) =&gt; {
    const existingLeads =
      JSON.parse(localStorage.getItem("existingLeads")) || [];

    profiles.forEach((profile) =&gt; {
      existingLeads.push({ ...profile, isEmailGenerated: false });
    });
    localStorage.setItem("existingLeads", JSON.stringify(existingLeads));
  };
</code></pre><p>Now, replace <code>handleSubmit</code> function in <code>app/components/Leads.jsx</code> with:</p><pre><code class="language-jsx">  const handleSubmit = async () =&gt; {
    setIsLoading(true);
    const lines = leadsProfile.split("\n");

    try {
      const responses = await Promise.all(
        lines.map((line) =&gt;
          fetch(`/api/personProfile?Professional Social Network_profile_url=${line}`),
        ),
      );

      const parsedResponses = await Promise.all(
        responses.map(async (res) =&gt; {
          if (!res.ok) {
            throw new Error(`Error fetching profile: ${res.statusText}`);
          }
          return res.json();
        }),
      );
      setIsLoading(false);
      setData((prev) =&gt; [...prev, ...parsedResponses]);
      handleSaveRecentLeads(parsedResponses);
    } catch (error) {
      console.error("Failed to fetch profiles:", error);
    } finally {
      setIsModalOpen(false);
    }
  };
</code></pre><p>Then create <code>app/api/personProfile/route.js</code></p><pre><code class="language-jsx">import { NextResponse } from "next/server";

export async function GET(request) {
  const params = request.url.split("?")[1];

  try {
    const response = await fetch(
      `https://nubela.co/proxycurl/api/v2/Professional Social Network?${
       params
      }`,
      {
        headers: {
          Authorization:`Bearer ${process.env.PROXYCURL_API_KEY}`,
        },
      },
    );

    const data = await response.json();
    return NextResponse.json(data);
  } catch (error) {
    console.log(error);
    return NextResponse.json({ error }); 
  }
}
</code></pre>
<p>Once connected, Professional Social Network profile data will be enriched with a single click. Something like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/enrich.gif" class="kg-image" alt="Enrich profiles by connecting with Proxycurl API" loading="lazy" width="1034" height="742"><figcaption><span style="white-space: pre-wrap;">Data Enrichment using Proxycurl</span></figcaption></figure><h3 id="step-6-creating-a-drawer-component-for-prompting">Step 6:&nbsp;Creating a Drawer component for prompting</h3><p>Now, let’s generate custom email content. Start by creating a Drawer component to prompt the user for email customizations.</p><p>For that, we will create <code>app/components/EmailDrawer.jsx</code></p><pre><code class="language-jsx">import { Button } from "@/components/ui/button";
import { Textarea } from "@/components/ui/textarea";
import {
  Sheet,
  SheetContent,
  SheetHeader,
  SheetTitle,
} from "@/components/ui/sheet";
import { useEffect, useState } from "react";
import Link from "next/link";
import { Mail } from "lucide-react";

function EmailDrawer({
  isOpen,
  setIsOpen,
  setSelectedLead,
  data,
  setGeneratedEmails,
}) {
  const [isLoading, setIsLoading] = useState(false);

  useEffect(() =&gt; {
    setGeneratedEmails(
      JSON.parse(localStorage.getItem("generatedEmails")) || [],
    );
  }, []);

  const initialPrompt = `You are professional sales with skills in cold outreach.

  Please customize the following email template with the attached Professional Social Network profile data. Please be consise and return the populated email template only.

Hi &lt;FIRST_NAME&gt;

&lt;SOMETHING INTERESTING FROM PROFILE DATA AT LEAST 2 SENTENCES&gt; Will a Professional Social Network Scraping API be useful for your  needs?`;

  const [prompt, setPrompt] = useState(initialPrompt);

  const handleSavePersonalizedEmail = (personalizedEmail, profile) =&gt; {
    const generatedEmails =
      JSON.parse(localStorage.getItem("generatedEmails")) || [];

    localStorage.setItem(
      "generatedEmails",
      JSON.stringify([
        ...generatedEmails,
        {
          email: personalizedEmail,
          public_identifier: profile.public_identifier,
        },
      ]),
    );

    setGeneratedEmails((prev) =&gt; [
      ...prev,
      {
        email: personalizedEmail,
        public_identifier: profile.public_identifier,
      },
    ]);
  };

  const handleSubmit = async () =&gt; {
    try {
      setIsLoading(true);
      const responses = await Promise.all(
        data.map((profile) =&gt;
          fetch(`/api/generateEmail`, {
            method: "POST",
            headers: {
              "Content-Type": "application/json",
            },
            body: JSON.stringify({ prompt, profileJSON: profile }),
          }),
        ),
      );

      const results = await Promise.all(
        responses.map((response) =&gt; response.json()),
      );
      results.forEach((email, index) =&gt; {
        handleSavePersonalizedEmail(email, data[index]);
      });
    } catch (error) {
      console.error("Error fetching email:", error);
    } finally {
      setIsLoading(false);
    }
  };

  const handleOpenChange = (open) =&gt; {
    setIsOpen(open);
    if (!open) {
      setSelectedLead(null);
    }
  };

  return (
    &lt;Sheet open={isOpen} onOpenChange={handleOpenChange}&gt;
      &lt;SheetContent className="overflow-auto"&gt;
        &lt;SheetHeader&gt;
          &lt;SheetTitle&gt;Bulk generate personalized emails&lt;/SheetTitle&gt;
        &lt;/SheetHeader&gt;
        &lt;div className="grid gap-4 py-4"&gt;
          &lt;span className="text-sm text-gray-500"&gt;
            Variables reference:{" "}
            &lt;i className="font-bold"&gt;
              first_name, last_name, full_name, headline, summary, company,
              company_url, city, state, country, experiences, educations, skills
              and many more.
            &lt;/i&gt;
          &lt;/span&gt;
          &lt;Link
            className="text-sm text-blue-500 underline hover:text-blue-600"
            href="https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint"
            target="_blank"
          &gt;
            Read more
          &lt;/Link&gt;
          &lt;Textarea
            placeholder="Type your prompt here."
            value={prompt}
            onChange={(e) =&gt; setPrompt(e.target.value)}
            className="h-[300px] overflow-y-auto"
          /&gt;

          &lt;div&gt;
            &lt;span className="whitespace-nowrap"&gt;Generate email for &lt;/span&gt;
            {data.map((profile, index) =&gt; (
              &lt;span className="font-bold" key={profile.public_identifier}&gt;
                {profile.full_name}
                {index &lt; data.length - 1 &amp;&amp; ", "}
              &lt;/span&gt;
            ))}
          &lt;/div&gt;

          &lt;Button onClick={handleSubmit}&gt;
            {isLoading ? (
              "Generating..."
            ) : (
              &lt;&gt;
                &lt;Mail className="w-4 h-4" /&gt;

                &lt;span&gt;Bulk generate emails&lt;/span&gt;
              &lt;/&gt;
            )}
          &lt;/Button&gt;
        &lt;/div&gt;
      &lt;/SheetContent&gt;
    &lt;/Sheet&gt;
  );
}

export default EmailDrawer;
</code></pre><p>And then add it to <code>app/components/Leads.jsx</code></p><pre><code class="language-jsx">import EmailDrawer from "./EmailDrawer";
// ...existing codes
  const [isEmailDrawerOpen, setIsEmailDrawerOpen] = useState(false);
  const [generatedEmails, setGeneratedEmails] = useState([]);
  const [selectedLead, setSelectedLead] = useState(null);

 const handleBulkGenerateEmail = () =&gt; {
    setIsLoading(true);
    setIsEmailDrawerOpen(true);
  };

// and then add it as onClick to "Generate all personalized" button

&lt;EmailDrawer
    data={data}
    selectedLead={selectedLead}
    setSelectedLead={setSelectedLead}
    isOpen={isEmailDrawerOpen}
    setIsOpen={setIsEmailDrawerOpen}
    setGeneratedEmails={setGeneratedEmails}
/&gt;
</code></pre><p>This opens a side drawer when a user clicks the "Generate all personalized" button. It looks like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/11/Side-Drawer-.png" class="kg-image" alt="Side drawer display in app for generating personalized emails" loading="lazy" width="1492" height="1592"><figcaption><span style="white-space: pre-wrap;">Side Drawer feature</span></figcaption></figure><p>With this interface, it is easier to prompt OpenAI with your exact requirements.</p><h3 id="step-7-set-up-openai-api-route-for-email-generation">Step 7: Set Up OpenAI API Route for Email Generation</h3><p>To generate emails, we’ll need an API route to connect to OpenAI. </p><p>Create <code>app/api/generateEmail/route.js</code> and set this code up:</p><pre><code class="language-js">import { NextResponse } from "next/server";
import OpenAI from "openai";

export async function POST(request) {
  const openai = new OpenAI({
    apiKey: process.env.OPENAI_API_KEY,
  });

  const { prompt, profileJSON } = await request.json();

  try {
    const basePrompt = `
      ${prompt}
  
      Instructions: 
      Replace every variable that is in &lt;&gt; format with value from with the first_name from the profileJSON below.
      Replace &lt;SOMETHING INTERESTING FROM PROFILE DATA&gt; with something interesting from the profileJSON below.

      profileJSON:
      ${JSON.stringify(profileJSON)}
    `;

    const baseCompletion = await openai.chat.completions.create({
      model: "gpt-3.5-turbo",
      temperature: 0.65,
      messages: [{ role: "user", content: basePrompt }],
    });

    const promptOutput = baseCompletion.choices[0].message.content;
    return NextResponse.json(promptOutput);
  } catch (error) {
    console.log(error);
    return NextResponse.json({ error });
  }
}
</code></pre><p>This will call OpenAI’s API to generate personalized email copy for each lead.</p><h3 id="step-8-displaying-generated-emails">Step 8: Displaying generated emails</h3><p>To easily review and copy the generated emails, create a simple card component with a copy button.</p><p>Create <code>app/components/GeneratedEmailsGallery.jsx</code> and add the following code:</p><pre><code class="language-jsx">import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card";

function GeneratedEmailsGallery({ generatedEmails }) {
  const [copiedIndex, setCopiedIndex] = useState(null);
  const [currentPage, setCurrentPage] = useState(1);
  const emailsPerPage = 9;

  const handleCopy = (index) =&gt; {
    navigator.clipboard.writeText(generatedEmails[index]);
    setCopiedIndex(index);
    setTimeout(() =&gt; {
      setCopiedIndex(null);
    }, 2000);
  };

  if (!generatedEmails.length) return null;

  const totalPages = Math.ceil(generatedEmails.length / emailsPerPage);
  const startIndex = (currentPage - 1) * emailsPerPage;
  const displayedEmails = generatedEmails.slice(startIndex, startIndex + emailsPerPage);

  return (
    &lt;div className="mt-8"&gt;
      &lt;h2 className="mb-4 text-xl font-semibold"&gt;Generated Emails&lt;/h2&gt;
      &lt;div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3"&gt;
        {displayedEmails.map((email, index) =&gt; (
          &lt;Card key={startIndex + index} className="flex flex-col p-4 shadow-none"&gt;
            &lt;p className="mb-2 text-sm text-gray-600"&gt;Generated email for {email.public_identifier}&lt;/p&gt;
            &lt;div className="mb-2 h-[200px] overflow-y-auto bg-gray-50 p-4 rounded-md border"&gt;
              &lt;p className="text-sm whitespace-pre-wrap"&gt;{email.email}&lt;/p&gt;
            &lt;/div&gt;
            &lt;Button
              className="ml-auto w-16"
              variant="outline"
              size="sm"
              onClick={() =&gt; handleCopy(startIndex + index)}
            &gt;
              {(startIndex + index) === copiedIndex ? "Copied" : "Copy"}
            &lt;/Button&gt;
          &lt;/Card&gt;
        ))}
      &lt;/div&gt;
      {generatedEmails.length &gt; emailsPerPage &amp;&amp; (
        &lt;div className="flex justify-end items-center mt-4 space-x-2"&gt;
          &lt;Button
            variant="outline"
            size="sm"
            onClick={() =&gt; setCurrentPage(prev =&gt; Math.max(1, prev - 1))}
            disabled={currentPage === 1}
          &gt;
            Previous
          &lt;/Button&gt;
          &lt;span className="text-sm text-gray-500"&gt;
            Page {currentPage} of {totalPages}
          &lt;/span&gt;
          &lt;Button
            variant="outline"
            size="sm"
            onClick={() =&gt; setCurrentPage(prev =&gt; Math.min(totalPages, prev + 1))}
            disabled={currentPage === totalPages}
          &gt;
            Next
          &lt;/Button&gt;
        &lt;/div&gt;
      )}
    &lt;/div&gt;
  );
}

export default GeneratedEmailsGallery;
</code></pre><p>Finally, integrate this gallery in Leads.jsx:</p><pre><code class="language-jsx">import GeneratedEmailsGallery from "./GeneratedEmailsGallery";

//...existing codes
&lt;GeneratedEmailsGallery generatedEmails={generatedEmails} /&gt;
</code></pre><p>And that’s it! With Proxycurl and OpenAI at the core, now you’ve got your own Lemlist clone app. Goodbye to uninspiring generic emails and hello to bulk personalized emails, all with minimal manual work.&nbsp;</p><p>This is what you would've built - a fully functional email personalization tool, just like Lemlist's own. Here's the <a href="https://github.com/nubelaco/use-case-examples/tree/main/email-personalization?ref=nubela.co"><u>full source code</u></a> in our GitHub repository again.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/Oct-31-202415-13-521-ezgif.com-optimize.gif" class="kg-image" alt="Quick Demo for the Lemlist like App" loading="lazy" width="1210" height="748"><figcaption><span style="white-space: pre-wrap;">Application Demo </span></figcaption></figure><h2 id="application-features-2">Application Features </h2><p>Don’t forget to have fun and add your own twist wherever you want. If you come across any problems, feel free to reach out to us <a href="mailto:hello@nubela.co"><u>via email</u></a> or live chat.</p><h2 id="power-your-innovation-with-proxycurl"><strong>Power your innovation with Proxycurl&nbsp;</strong></h2><p>Building something meaningful takes a lot, and as a developer, I know the drill. Proxycurl understands this journey. Our tools are crafted with your unique challenges in mind. We host <a href="https://nubela.co/proxycurl/people-api?ref=nubela.co" rel="noreferrer">a suite of APIs</a> and <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co" rel="noreferrer">a database of over 500 million profiles</a>. The possibilities to empower this data is endless, just like your potential. Let us handle the data heavy-lifting so you can do what you do best: create, build, and innovate.</p><p>Ready to turn your ideas into reality? Let us give you a push. Get free credits upon <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co"><u>sign up</u></a> with Proxycurl!<br></p><h2 id="faqs">FAQs</h2><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><b><strong style="white-space: pre-wrap;">What is Lemlist?</strong></b></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Lemlist is a popular email outreach platform that helps businesses send personalized cold emails at scale. It enables users to customize their emails, automate follow-ups, and track engagement, all while aiming to improve deliverability and response rates. The platform is particularly valued for its ability to create hyper-personalized email campaigns to stand out in crowded inboxes.</span></p></div>
        </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><b><strong style="white-space: pre-wrap;">Why should I build a Lemlist clone instead of using Lemlist directly?</strong></b></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Building your own app offers flexibility, customization, and ownership. You can tailor the app to your specific needs, integrate additional features, and avoid subscription costs associated with pre-built tools.</span></p></div>
        </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><b><strong style="white-space: pre-wrap;">Is it cost-effective to build this app compared to using Lemlist?</strong></b></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Yes, while there may be initial development costs, building your app eliminates ongoing subscription fees and gives you complete control over the tool.</span></p></div>
        </div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><b><strong style="white-space: pre-wrap;">Can I customize the features of my Lemlist clone app?</strong></b></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"></path>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">Absolutely! This guide offers a base implementation, but you can expand its functionality based on your requirements. For instance, you can add email scheduling, advanced analytics, or A/B testing capabilities.</span></p></div>
        </div> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ This Is How I Accessed LinkedIn Sales Navigator API: A Guide ]]></title>
        <description><![CDATA[ Unlock Professional Social Network Sales Navigator API&#39;s potential. Steps, Features, pricing, and benefits for boosting your sales strategy. ]]></description>
        <link>https://nubela.co/blog/access-linkedin-sales-navigator-api-guide/</link>
        <guid isPermaLink="false">672e65ea1cb59d0001b1787f</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Thu, 14 Nov 2024 10:14:59 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_419.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>So you want to rank up your lead generation game. Cut through the noise and get to prospects and ideal candidates faster. Well, the LinkedIn Sales Navigator API is the thing people usually look at first, but the catch is that getting access is nowhere near as straightforward as most guides make it sound.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/linkedin</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/[deleted]</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">LinkedIn has been very restrictive in providing API access in the past.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/linkedin/comments/6zw0xq/is_there_a_sales_navigator_api/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Today, I will share how I accessed the LinkedIn Sales Navigator API and everything you will need to know about it. From set ups with actual code snippets, to the challenges you might face, we will get through each aspect one by one. Lastly, I will introduce you to Proxycurl, and explain what changed since then. Intrigued? Let's get right into it.</p>
<p>I'll kick this off with a quick demo on how you can start pulling sales data using LinkedIn Sales Navigator API.</p>
<pre><code class="language-python">import requests

headers = {
    'Authorization': 'Bearer your_access_token',
}

response = requests.get('https://api.linkedin.com/v2/salesNavigatorData', headers=headers)

print(response.json())
</code></pre>
<p>By the end of this article, you will understand what it actually takes to access LinkedIn's professional network data and what your practical alternatives look like today.</p>
<h2 id="what-is-the-linkedin-sales-navigator-api">What is the LinkedIn Sales Navigator API?</h2>
<p>In a sentence, LinkedIn Sales Navigator API is an advanced tool that grants access to LinkedIn's network and professional data. Tapping into that data means you get valuable insights for sales intelligence, lead generation, and market research.</p>
<p>Here's a simple use case. Let's say you're tracking a few candidates for a Chief Marketing Officer role at your company. With LinkedIn Sales Navigator API, you can create a custom dashboard to keep an eye on these individuals. The dashboard will automatically update whenever someone on your list changes jobs or updates their profile, so you're always in the loop.</p>
<p>With this API, you can:</p>
<h3 id="fetch-detailed-personal-and-company-data"><strong>Fetch detailed personal and company data</strong></h3>
<p>Personally, this was the reason why I tried the LinkedIn Sales Navigator API. The API allows you to fetch personal and company data from LinkedIn and enrich your platform by integrating these profiles into your platform. Everything from work history, skills, endorsements, mutual connections, will help you understand your prospect clients or possible networks.</p>
<h3 id="data-recency-and-sync"><strong>Data Recency and Sync</strong></h3>
<p>LinkedIn Sales Navigator API allows you to <a href="https://www.linkedin.com/help/sales-navigator/answer/a106005sync?ref=nubela.co">sync</a> the pulled data with your existing customer information. Plus, you can directly create contact records from these search results and build a robust contact database in no time. Now you've got a better market view to draw your strategies and make decisions.</p>
<p>What's better, using the real-time data sync feature of LinkedIn Sales Navigator API and synchronizing data directly from search queries, you can always pull the most current and accurate information on your platform.</p>
<h3 id="advanced-search-option"><strong>Advanced Search Option</strong></h3>
<p>With LinkedIn Sales Navigator, you can filter your search based on criteria like industry, location, company, job title, experience, etc. Pair that with its data syncing capabilities, and you now have a custom contact record of potential leads in your database.</p>
<h2 id="how-to-access-linkedin-sales-navigator-api">How to Access LinkedIn Sales Navigator API</h2>
<p>Accessing the LinkedIn Sales Navigator API was not as straightforward as I thought. I went in with the assumption that you could just create an account and call an endpoint. There are a lot of restrictions and costs involved with the tool.</p>
<p>Follow these steps to access the tool:</p>
<h3 id="step-1-get-the-sales-navigator-subscription"><strong>Step 1: Get the Sales Navigator Subscription</strong></h3>
<p>The first step is to have an active Sales Navigator subscription. Head on over to <a href="https://business.linkedin.com/sales-solutions/compare-plans?ref=nubela.co">Sales Navigator Subscriptions</a> and choose one of their paid plans. You need to pay your way to a premium plan for access to advanced features for lead generation, prospecting, and sales engagement.</p>
<h3 id="step-2-apply-for-api-access"><strong>Step 2: Apply for API Access</strong></h3>
<p>With a Sales Navigator subscription, you can now apply for API access through LinkedIn's <a href="https://developer.linkedin.com/?ref=nubela.co">developer platform</a>. Here, you must provide a detailed explanation of your use case and how you plan to use the API.</p>
<h3 id="step-3-wait-for-the-approval-process"><strong>Step 3: Wait for the Approval Process</strong></h3>
<p>Once you have applied for the access, it goes through an approval process. LinkedIn carefully reviews API access applications to ensure they align with their guidelines and terms of service. The approval process can take several weeks, so you have to be patient.</p>
<h2 id="how-to-authenticate-with-linkedin-sales-navigator-api">How to Authenticate with LinkedIn Sales Navigator API</h2>
<p>Here's how to authenticate with the Sales Navigator API.</p>
<pre><code class="language-python">import requests

# Function to authenticate and get access token
def get_access_token(client_id, client_secret, redirect_uri, auth_code):
    url = &quot;https://www.linkedin.com/oauth/v2/accessToken&quot;
    params = {
        'grant_type': 'authorization_code',
        'code': auth_code,
        'redirect_uri': redirect_uri,
        'client_id': client_id,
        'client_secret': client_secret
    }

    response = requests.post(url, data=params)
    return response.json()

# Example usage
client_id = 'your_client_id'
client_secret = 'your_client_secret'
redirect_uri = 'your_redirect_uri'
auth_code = 'your_auth_code'

access_token = get_access_token(client_id, client_secret, redirect_uri, auth_code)
print(access_token)
</code></pre>
<h2 id="pulling-data-from-linkedin-sales-navigator-api-a-guide">Pulling Data from LinkedIn Sales Navigator API, A Guide</h2>
<p>Due to the access restrictions and limitations, fetching data directly from LinkedIn Sales Navigator requires a more complex approach. The approval process in itself is a headache. Once you're approved, you can use the API to fetch data.</p>
<p>Take a look at this instance, a snippet for retrieving a person profile.</p>
<pre><code class="language-python">import linkedin_sales_navigator  # Assuming a library exists for the API

# Replace with your access token and person ID
access_token = 'your_linkedin_sales_navigator_access_token'
person_id = 'john-doe-123456'

client = linkedin_sales_navigator.Client(access_token)
profile_data = client.get_profile(person_id)

# Returned data may include limited fields based on your access level
print(profile_data)  # This might only contain basic information like name, headline, etc.
</code></pre>
<p>The person profile returned by your request can have basic fields like the person's name, job title, location, and industry, or a greater number of fields including experience and education, depending on your subscription. Here's what your output should look like:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;John Doe&quot;,
  &quot;headline&quot;: &quot;Senior Software Engineer at TechCorp&quot;,
  &quot;linkedin_url&quot;: &quot;https://linkedin.com/in/john-doe-123456/&quot;,
  &quot;profile_picture_url&quot;: &quot;https://media.licdn.com/profile-pic.jpg&quot;,
  &quot;current_position&quot;: {
    &quot;title&quot;: &quot;Senior Software Engineer&quot;,
    &quot;company_name&quot;: &quot;TechCorp&quot;,
    &quot;start_date&quot;: &quot;2019-06&quot;
  },
  &quot;location&quot;: &quot;San Francisco Bay Area&quot;,
  &quot;connections_count&quot;: 500,
  &quot;summary&quot;: &quot;Passionate software engineer with over 7 years of experience in building scalable web applications and AI solutions.&quot;,
  &quot;skills&quot;: [&quot;Java&quot;, &quot;Spring Boot&quot;, &quot;Cloud Computing&quot;, &quot;Machine Learning&quot;]
}
</code></pre>
<p>Be advised the data returned might be limited by your access level, and could take longer to obtain due to the application process.</p>
<p>But that's not all. Here are a few major things to keep in mind while trying to pull data using LinkedIn Sales Navigator API:</p>
<h3 id="define-the-scope"><strong>Define the Scope</strong></h3>
<p>Determine what kind of data you want to extract. Is it lead data, company profiles, or job postings? Choose the fields you want so you know the right API endpoints to call.</p>
<h3 id="api-documentation"><strong>API Documentation</strong></h3>
<p>Help yourself to the LinkedIn Sales Navigator API documentation to understand the API structure, endpoints, parameters, and best practices.</p>
<h3 id="rate-limits"><strong>Rate Limits</strong></h3>
<p>Be mindful of the <a href="https://learn.microsoft.com/en-us/linkedin/shared/api-guide/concepts/rate-limits?ref=nubela.co">API rate limits</a>. Don't fall for the same thing I did. You can only make a limited number of API calls within a certain time frame. For instance, you may be limited to 1000 API requests per day, depending on your subscription tier. Go over and your application will stop functioning temporarily.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/linkedin</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/atheistDev</span>
<span style="color:#878a8c;">· ▲ 4</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">For profile fetching, LinkedIn API is very tightly controlled. You usually only get basic profile info from users who auth into your app.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/linkedin/comments/6zw0xq/is_there_a_sales_navigator_api/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="is-linkedin-sales-navigator-api-free">Is LinkedIn Sales Navigator API Free?</h2>
<p>Just to be clear, LinkedIn Sales Navigator API is <strong>not</strong> a free service. The pricing for Sales Navigator is publicly available and may vary based on your use case. You can find more information about pricing and usage limits by contacting LinkedIn's <a href="https://developer.linkedin.com/?ref=nubela.co">developer support</a> or reviewing their documentation.</p>
<h2 id="difficulty-in-using-linkedin-sales-navigator-api">Difficulty in Using LinkedIn Sales Navigator API</h2>
<p>There are a lot of problems that come with using LinkedIn Sales Navigator API. Some I expected, and some I faced along the way.</p>
<p>Here are some problems you should look out for:</p>
<h3 id="access-restrictions"><strong>Access Restrictions</strong></h3>
<p>As I stated before, the approval process is a lengthy one. It depends on your application as much as it depends on LinkedIn's process. The wait is not the worst part however, as it is hard to get approval. You may need to meet specific criteria, such as having a verified LinkedIn profile or being part of a business account. There is always a risk of rejection if your use case is not deemed appropriate. Check out <a href="https://developer.linkedin.com/?ref=nubela.co">API access</a> in LinkedIn for more information.</p>
<h3 id="api-rate-limits"><strong>API Rate Limits</strong></h3>
<p>I went overboard with my API calls and LinkedIn temporarily shut down my app. There are strict <a href="https://learn.microsoft.com/en-us/linkedin/shared/api-guide/concepts/rate-limits?ref=nubela.co">rate limits</a> on the number of API calls you can make within a specific timeframe. The amount will depend on what subscription you paid for. Be careful with the amount of APIs you call if you don't want to go through the same thing I did.</p>
<p>It was an inconvenience for sure but the consequences can be tenfold for businesses than individuals. On a large scale, encountering these limitations can potentially hinder operations.</p>
<h3 id="cost"><strong>Cost</strong></h3>
<p>You'll need an active <a href="https://business.linkedin.com/sales-solutions/compare-plans?ref=nubela.co">Sales Navigator subscription</a> to access the API. It does not come cheap and so it can be very hard for startups or small businesses.</p>
<h3 id="technical-complexity-and-steep-learning-curve"><strong>Technical Complexity and Steep Learning Curve</strong></h3>
<p>Integrating the LinkedIn Sales Navigator API into your systems is easier said than done. You also have to devote your time to understand the API's structure, endpoints, and best practices despite your technical expertise. Then again, you have to be on the lookout for API errors and rate limits.</p>
<h2 id="enter-proxycurl-the-better-alternative-to-linkedin-sales-navigator-api">Enter Proxycurl, The Better Alternative to LinkedIn Sales Navigator API</h2>
<p>LinkedIn Sales Navigator API has baggage of its own. There is no avoiding its shortcomings, especially when it comes to access, rate limits, and customization.</p>
<p>This is where <strong>Proxycurl</strong> steps in as a superior alternative API solution.</p>
<blockquote>
<p><strong>Update:</strong> Proxycurl API has since been sunset. I am the founder behind Proxycurl, and the work has since moved into <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, where I'm now building a broader B2B data platform. I'm retaining this section because the comparison still explains the gap people ran into with LinkedIn's API, but if you're evaluating tools today, start with NinjaPear instead of trying to sign up for Proxycurl.</p>
</blockquote>
<h2 id="what-is-proxycurl">What is Proxycurl?</h2>
<p>Proxycurl is an API product that allows businesses and developers to pull and enrich professional profile and company data from LinkedIn. Whether you're building a B2B sales tool, an HR application, or a data aggregator, Proxycurl provides the information you need with fewer barriers and greater customization options compared to LinkedIn Sales Navigator API.</p>
<h2 id="why-is-proxycurl-better-than-linkedin-sales-navigator-api">Why is Proxycurl better than LinkedIn Sales Navigator API?</h2>
<p>Proxycurl is better than LinkedIn Sales Navigator API. Let me prove it to you.</p>
<h3 id="no-approval-process"><strong>No Approval Process</strong></h3>
<p>You don't have to cast your application and hope you get approved while you're dangling for weeks on end. And LinkedIn's strict eligibility criteria does you no favors. Whether you're an independent researcher, a startup, a small business or a global enterprise, Proxycurl was open for all.</p>
<h3 id="high-api-rate-limits"><strong>High API Rate Limits</strong></h3>
<p>In comparison, Proxycurl offers significantly higher rate limits than LinkedIn Sales Navigator API. Pair that up with a high degree of scalability, and you have got yourself a tool that grows alongside you.</p>
<h3 id="customizable-data-output"><strong>Customizable Data Output</strong></h3>
<p>Proxycurl provides greater flexibility in data extraction. You can specify the exact fields and information you need, then customize the data output to match your specific requirements.</p>
<p>You also have the ability to access historical data as well. Proxycurl allows you flexibility in data freshness, with an option to extract freshly-scraped data, data 29 days old or younger or historical data that is older than 29 days.</p>
<h3 id="transparent-pricing-plans"><strong>Transparent Pricing Plans</strong></h3>
<p>Proxycurl's pricing plans were publicly available on the website. Along with plans, there were clear tiers and usage-based fees for those who were unsure about their usage. It also goes without saying that the cost was far more affordable than that of LinkedIn Sales Navigator.</p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>LinkedIn Sales Navigator</th>
<th>Proxycurl</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>N/A</td>
<td>100 free credits upon signup</td>
</tr>
<tr>
<td>Basic Paid</td>
<td>Core (for individuals) $99/mo</td>
<td>Starter $49/mo</td>
</tr>
<tr>
<td>High-end Paid</td>
<td>Advanced Plus (for teams) $1,600 per person/year</td>
<td>Enterprise &lt; $2,000/year</td>
</tr>
</tbody>
</table>
<h2 id="how-to-pull-data-using-proxycurl-the-easy-way">How to pull data using Proxycurl, The Easy Way</h2>
<p>Fetching data with Proxycurl is super simple. All you need is an API key and the target URL.</p>
<p>Here's a snippet using Proxycurl, doing the same thing as I did with the LinkedIn API, pulling a person profile.</p>
<pre><code class="language-python">import requests

# Replace with your Proxycurl API key
api_key = 'your_proxycurl_api_key'
person_linkedin_url = 'https://linkedin.com/in/john-doe-123456/'

url = f'https://nubela.co/proxycurl/api/v2/linkedin?url={person_linkedin_url}'
headers = {'Authorization': f'Bearer {api_key}'}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    profile_data = response.json()
    print(profile_data)  # This could include richer data depending on Proxycurl's capabilities
else:
    print(f&quot;Error: {response.status_code}&quot;)
</code></pre>
<p>And that's it. Here's what the output from Proxycurl looks like.</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;John Doe&quot;,
  &quot;headline&quot;: &quot;Senior Software Engineer at TechCorp&quot;,
  &quot;profile_picture_url&quot;: &quot;https://example.com/profile-pic.jpg&quot;,
  &quot;linkedin_url&quot;: &quot;https://linkedin.com/in/john-doe-123456/&quot;,
  &quot;current_company&quot;: {
    &quot;name&quot;: &quot;TechCorp&quot;,
    &quot;position&quot;: &quot;Senior Software Engineer&quot;,
    &quot;url&quot;: &quot;https://linkedin.com/company/techcorp&quot;,
    &quot;start_date&quot;: &quot;2019-06-01&quot;
  },
  &quot;past_companies&quot;: [
    {
      &quot;name&quot;: &quot;WebInnovators&quot;,
      &quot;position&quot;: &quot;Software Engineer&quot;,
      &quot;start_date&quot;: &quot;2016-08-01&quot;,
      &quot;end_date&quot;: &quot;2019-05-31&quot;
    }
  ],
  &quot;location&quot;: &quot;San Francisco, California, USA&quot;,
  &quot;education&quot;: [
    {
      &quot;institution&quot;: &quot;Stanford University&quot;,
      &quot;degree&quot;: &quot;Master's in Computer Science&quot;,
      &quot;start_date&quot;: &quot;2012-09-01&quot;,
      &quot;end_date&quot;: &quot;2014-06-01&quot;
    }
  ],
  &quot;skills&quot;: [&quot;Python&quot;, &quot;Java&quot;, &quot;AWS&quot;, &quot;Machine Learning&quot;],
  &quot;contact_info&quot;: {
    &quot;email&quot;: &quot;john.doe@example.com&quot;,
    &quot;phone&quot;: &quot;+1-234-567-8901&quot;
  },
  &quot;last_activity&quot;: {
    &quot;date&quot;: &quot;2023-10-15&quot;,
    &quot;content&quot;: &quot;Excited to announce the launch of our new AI-powered platform at TechCorp!&quot;
  },
  &quot;remaining_data&quot;: null
}
</code></pre>
<p>The Person Profile Endpoint here will return you their name, social media ids, personal email and much more. The data returned is more comprehensive and is readily available with a valid API key.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/ClinicalCape</span>
<span style="color:#878a8c;">· ▲ 12</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Sales Nav is great for finding people, but if you need to push data into your own systems at scale, the official options are limited.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="proxycurl-api-vs-linkedin-sales-navigator-api-a-summary">Proxycurl API vs LinkedIn Sales Navigator API, A Summary</h2>
<p>Let's bring these two API solutions head-to-head and see the difference.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Access</th>
<th>Data Quality</th>
<th>Pricing</th>
<th>Ease of Use</th>
<th>API Limits</th>
<th>Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>LinkedIn Sales Navigator API</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>2.4/5</td>
</tr>
<tr>
<td>Proxycurl API</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>4.4/5</td>
</tr>
<tr>
<td><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a></td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>4.4/5</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th><strong>Feature</strong></th>
<th><strong>LinkedIn Sales Navigator API</strong></th>
<th><strong>Proxycurl API</strong></th>
<th><strong>NinjaPear</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Access</strong></td>
<td>Lengthy approval process required</td>
<td>Instant access with API key</td>
<td>Instant access with API key</td>
</tr>
<tr>
<td><strong>API Rate Limits</strong></td>
<td>Limited number of API calls per day</td>
<td>High API rate limits for large-scale data pulling</td>
<td>Paid API endpoints limited to 50 requests/minute at account level</td>
</tr>
<tr>
<td><strong>Customization</strong></td>
<td>Limited customization for data fields</td>
<td>Flexible and customizable data output</td>
<td>Multiple API endpoints across company, employee, competitor, customer, and monitor data</td>
</tr>
<tr>
<td><strong>Pricing</strong></td>
<td>Expensive, tiered pricing model</td>
<td>Transparent, affordable pricing</td>
<td>Transparent credit-based pricing with 3-day free trial and 10 credits</td>
</tr>
<tr>
<td><strong>Real-Time Data</strong></td>
<td>Data may not always be up-to-date</td>
<td>Accurate, real-time data</td>
<td>Fresh company and profile data from public web sources</td>
</tr>
<tr>
<td><strong>Ease of Use</strong></td>
<td>Requires complex setup and management</td>
<td>Easy to use with simple API calls</td>
<td>REST API plus Python and JavaScript SDKs</td>
</tr>
<tr>
<td><strong>Customer Support</strong></td>
<td>Limited customer support</td>
<td>Responsive and developer-friendly support</td>
<td>Direct docs, SDKs, and AI-agent friendly docs</td>
</tr>
</tbody>
</table>
<h2 id="final-thoughts">Final Thoughts</h2>
<p>The LinkedIn Sales Navigator API is a powerful tool if you can get through the process. Follow the steps above and you can eventually get your data out of LinkedIn Sales Navigator API. But that approval process is real, and so are the limits that come after it.</p>
<p>The practical lesson here is simple. If you specifically need the official LinkedIn route, go in with realistic expectations. If what you actually need is usable B2B data infrastructure, then the better move today is to skip the romance of "official access" and start with <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is where the work moved after Proxycurl.</p>
<p>No drama. Just pick the path that gets your product shipped.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="how-do-i-get-data-from-linkedin-sales-navigator">How do I get data from LinkedIn Sales Navigator?</h4>
<p>LinkedIn Sales Navigator does not have a native functionality for exporting lead lists. To export your lists to a CSV file, you typically need a third party tool like Evaboot and then follow through with their steps.</p>
<h4 id="can-you-automate-linkedin-sales-navigator">Can you automate LinkedIn Sales Navigator?</h4>
<p>Yes, LinkedIn Sales Navigator's advanced search filters allow you to identify and connect with relevant prospects. Tasks like sending personalized InMail messages, updates, and follow-ups based on insights can be automated through surrounding sales workflows, though the official API access is still limited.</p>
<h4 id="can-i-get-linkedin-sales-navigator-for-free">Can I get LinkedIn Sales Navigator for free?</h4>
<p>LinkedIn Sales Navigator is a paid product. You can sign up for a LinkedIn Sales Navigator free trial with your LinkedIn account. However, the free trial is only available for members who are currently <strong>not</strong> on any LinkedIn paid subscription plan and have not taken any LinkedIn free trials for the last 365 days.</p>
<h4 id="can-i-access-linkedin-profiles-directly-through-the-linkedin-sales-navigator-api">Can I access LinkedIn profiles directly through the LinkedIn Sales Navigator API?</h4>
<p>Direct profile access is limited, but you can access data related to leads and accounts, which integrates into CRM and sales systems while respecting LinkedIn's data-use policies.</p>
<h4 id="is-linkedin-sales-navigator-worth-it">Is LinkedIn Sales Navigator worth it?</h4>
<p>With benefits like advanced search filters, lead recommendations, and granular analytics, it is a good choice for sales teams and recruiters already living inside LinkedIn. If your goal is raw API access and fast implementation, that is where people usually start looking for alternatives.</p>
<h4 id="how-to-scrape-data-from-linkedin-sales-navigator-for-free">How to scrape data from LinkedIn Sales Navigator for free?</h4>
<p>You can scrape data from LinkedIn Sales Navigator for free manually. That usually means the tedious path of searching profiles one by one and copy-pasting information. It is only practical if you need data on a very small number of LinkedIn Sales Navigator profiles.</p>
<h4 id="how-secure-is-the-linkedin-sales-navigator-api">How secure is the LinkedIn Sales Navigator API?</h4>
<p>The API is designed with LinkedIn's data security policies in mind, so the connections are secure and access is controlled according to the user's license.</p>
<h4 id="is-linkedin-sales-navigator-api-gdpr-compliant">Is LinkedIn Sales Navigator API GDPR-compliant?</h4>
<p>LinkedIn adheres to GDPR and other data protection laws, so API users must also follow data privacy guidelines, especially when handling personal information from the platform.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ People Data Labs Pricing: Is it worth it? ]]></title>
        <description><![CDATA[ Learn People Data Labs Pricing: Plans, pricing and product. Review free and paid plans. Is the premium price worth it? ]]></description>
        <link>https://nubela.co/blog/people-data-labs-pricing/</link>
        <guid isPermaLink="false">67295bb71cb59d0001b1766c</guid>
        <category><![CDATA[ people data labs ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Fri, 08 Nov 2024 12:19:50 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_418-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>People Data Labs pricing starts at <strong>$98/month</strong> for Person Data, <strong>$100/month</strong> for Company Data, and <strong>$95.40/month</strong> for IP Enrichment on the lowest paid tiers. That is the answer most people came for. The more useful answer is whether that pricing actually makes sense for your use case, and my view is still mostly no, unless you specifically need PDL’s breadth and already have the engineering muscle to work around its quirks.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Entrepreneur</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/martindelirio</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">prices are insane though</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Entrepreneur/comments/1asgkb6/anybody_used_people_data_labs_for_customer/ml3pilj/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Price is a big factor when you're looking for a data provider, whether you're a business looking to save some budget, or an independent researcher working with whatever funds you have. Of course, when you do spend your budget, you would want every penny of that budget spent to be worth it.</p>
<p>And so today, let's look into how much People Data Labs costs and what you'll get in return. But of course you can find that information on their pricing page effortlessly. So here’s my proposition, along with their pricing, we will look what they offer for it, and if the investment is truly worth it.</p>
<p>For starters, here's an updated table showing <strong>People Data Labs pricing</strong> plans.</p>
<table>
<thead>
<tr>
<th>Plans</th>
<th>Price</th>
<th>Data Records</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free</td>
<td>$0/mo</td>
<td>Up to 100 monthly person/company records, 25 monthly IP records</td>
</tr>
<tr>
<td>Pro, Person Data</td>
<td>$98/mo</td>
<td>Starts at 350 monthly credits, $0.28/profile</td>
</tr>
<tr>
<td>Pro, Company Data</td>
<td>$100/mo</td>
<td>Starts at 1,000 monthly credits, $0.10/profile</td>
</tr>
<tr>
<td>Pro, IP Data</td>
<td>$95.40/mo</td>
<td>Starts at 1,325 monthly credits, $0.072/profile</td>
</tr>
<tr>
<td>Enterprise</td>
<td>Custom</td>
<td>Starts at 100,000/year for person, 400,000/year for company, 250,000/year for IP</td>
</tr>
</tbody>
</table>
<p><strong><em>Note:</em>* PDL’s self-serve pricing has changed a bit since the older version of this article. They now also offer </strong>30-day free trials with 500 API credits<strong> for supported products, but their normal free plan is still much more limited than that. Also, free access still does </strong>not*<em> give you unobfuscated contact data.</em></p>
<h2 id="what-does-people-data-labs-do">What does People Data Labs do?</h2>
<p><a href="https://www.peopledatalabs.com/?ref=nubela.co" rel="nofollow">People Data Labs (PDL)</a> is a data provider that helps companies build compliant data products at scale. They aggregate public web data and partner data, then package it into datasets and APIs.</p>
<p>Their data points offering is still one of the largest in the market. They provide everything from name, location, contact information, social media details, and much more. Though they are still guilty of breaking down one data point into many granular forms, which inflates the absolute quantity. For instance, job location is split into multiple fields like <code>job_company_location_name</code>, <code>job_company_location_locality</code>, <code>job_company_location_metro</code>, and <code>job_company_location_region</code>.</p>
<p>Customers who opt for PDL’s service generally seem satisfied with coverage, even when they complain about recency or complexity. That part of the old article still holds.</p>
<h2 id="people-data-labs-pricing-plans">People Data Labs Pricing Plans</h2>
<p><img alt="People Data Labs pricing page screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/c79b50911678-1.webp" /></p>
<p>The pricing model still has three main tiers across product categories: Free, Pro, and Enterprise.</p>
<p>For Person, Company, and IP data, the Free plan is mostly for testing. Pro is the actual self-serve paid plan. Enterprise is where they push you once your volume gets serious.</p>
<p>A few important updates from PDL’s current docs:</p>
<ul>
<li><strong>Free plan:</strong> up to 100 monthly person/company records, 25 monthly IP records</li>
<li><strong>Pro plan:</strong> monthly or annual billing, with volume discounts</li>
<li><strong>Enterprise:</strong> starts at 100,000 annual credits for Person APIs, 400,000 for Company APIs, and 250,000 for IP APIs</li>
<li><strong>Free trials:</strong> 500 credits for 30 days on supported products</li>
<li><strong>Contact data and premium fields:</strong> locked behind paid plans</li>
</ul>
<p>Each tier provides access to different data fields, some of which are behind paywalls. The Free plan comes with limited field access, the Pro plan includes moderate access, and the Enterprise plan offers the most extensive field access. If your current plan doesn't cover specific fields you need, you can add them manually. Keep in mind, though, that each additional field bundle you add is priced per credit.</p>
<p>See the field bundles pricing table below.</p>
<table>
<thead>
<tr>
<th>Field Bundle</th>
<th>Type</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Inferred Salary</td>
<td>Person</td>
<td>$0.01</td>
</tr>
<tr>
<td>Inferred Years Experience</td>
<td>Person</td>
<td>$0.01</td>
</tr>
<tr>
<td>Professional Social Network Connections</td>
<td>Person</td>
<td>$0.01</td>
</tr>
<tr>
<td>Premium Resume Fields</td>
<td>Person</td>
<td>$0.03</td>
</tr>
<tr>
<td>Ticker Information</td>
<td>Person</td>
<td>$0.01</td>
</tr>
<tr>
<td>Premium Company Attributes</td>
<td>Person</td>
<td>$0.03</td>
</tr>
<tr>
<td>Company Premium</td>
<td>Company</td>
<td>$0.10</td>
</tr>
<tr>
<td>Inferred Revenue</td>
<td>Company</td>
<td>$0.03</td>
</tr>
<tr>
<td>Funding Details</td>
<td>Company</td>
<td>$0.08</td>
</tr>
</tbody>
</table>
<p>That add-on structure is one of my recurring issues with PDL pricing. The sticker price is only the start. Once you actually want richer data, the bill moves.</p>
<h2 id="people-data-labs-api-pricing">People Data Labs API Pricing</h2>
<p>Apart from their subscription plan, there is still a usage-based credit model under the Pro plan. You choose the product, buy credits, and credits are consumed on successful matches.</p>
<p>One thing PDL does clearly now is explain credit consumption:</p>
<ul>
<li><strong>Person, Company, and IP Enrichment APIs:</strong> usually 1 credit per successful request</li>
<li><strong>Person and Company Search APIs:</strong> 1 credit per successful profile returned, so a single request can burn multiple credits</li>
<li><strong>Autocomplete and Cleaner APIs:</strong> handled with rate limits instead of credit charges</li>
</ul>
<p>Below, you'll find the updated pricing details for the main APIs provided by People Data Labs. It is still pretty broken down, and yes, it is still a bit of a maze.</p>
<h3 id="person-enrichment-and-person-search-apis-pricing">Person Enrichment and Person Search APIs Pricing</h3>
<p><strong>Person Enrichment API:</strong> Enrich individual data by allowing access to all fields in person datasets. (Cost: 1 credit)</p>
<p><strong>Person Search APIs:</strong> Search datasets for individuals that match your query. (Cost: 1 credit per successful profile returned)</p>
<table>
<thead>
<tr>
<th>Payment Cycle</th>
<th>Tier</th>
<th>Credits</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Monthly</td>
<td>1</td>
<td>350 to 2,500</td>
<td>$98 to $700 ($0.28/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>2,501 to 5,000</td>
<td>$662.77 to $1,325.00 ($0.265/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>5,001 to 8,333</td>
<td>$1,250.25 to $2,083.25 ($0.25/profile)</td>
</tr>
<tr>
<td>Annual</td>
<td>1</td>
<td>4,200 to 30,000</td>
<td>$940.80 to $6,720.00 ($0.224/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>30,001 to 60,000</td>
<td>$6,360.21 to $12,720.00 ($0.212/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>60,001 to 99,999</td>
<td>$12,000.20 to $19,999.80 ($0.20/profile)</td>
</tr>
</tbody>
</table>
<h3 id="person-identify-api-pricing">Person Identify API Pricing</h3>
<p><strong>Person Identify API:</strong> Search through the dataset to find profiles that best match your query. (Cost: 1 credit)</p>
<table>
<thead>
<tr>
<th>Payment Cycle</th>
<th>Tier</th>
<th>Credits</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Monthly</td>
<td>1</td>
<td>200 to 499</td>
<td>$110.00 to $274.45 ($0.55/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>500 to 999</td>
<td>$262.50 to $524.48 ($0.525/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>1,000 to 4,167</td>
<td>$500.00 to $2,083.50 ($0.50/profile)</td>
</tr>
<tr>
<td>Annual</td>
<td>1</td>
<td>2,400 to 5,999</td>
<td>$1,056.00 to $2,639.56 ($0.44/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>6,000 to 11,999</td>
<td>$2,520.00 to $5,039.58 ($0.42/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>12,000 to 49,999</td>
<td>$4,800.00 to $19,999.60 ($0.40/profile)</td>
</tr>
</tbody>
</table>
<p>That is one of the biggest pricing changes worth calling out. The old article listed Person Identify at around $0.10 down to $0.065 monthly. The current docs show <strong>$0.55 down to $0.50 monthly</strong>. That is not a rounding issue. That is a meaningful difference.</p>
<h3 id="company-enrichment-and-company-search-apis-pricing">Company Enrichment and Company Search APIs Pricing</h3>
<p><strong>Company Enrichment API:</strong> Enrich company data by allowing access to all fields in the company schema. (Cost: 1 credit)</p>
<p><strong>Company Search API:</strong> Search datasets for companies that match your query. (Cost: 1 credit per successful profile returned)</p>
<table>
<thead>
<tr>
<th>Payment Cycle</th>
<th>Tier</th>
<th>Credits</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Monthly</td>
<td>1</td>
<td>1,000 to 10,000</td>
<td>$100.00 to $1,000.00 ($0.10/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>10,001 to 25,000</td>
<td>$750.08 to $1,875.00 ($0.075/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>25,001 to 33,333</td>
<td>$1,625.07 to $2,166.65 ($0.065/profile)</td>
</tr>
<tr>
<td>Annual</td>
<td>1</td>
<td>12,000 to 120,000</td>
<td>$960.00 to $9,600.00 ($0.08/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>120,001 to 300,000</td>
<td>$7,200.06 to $18,000.00 ($0.06/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>300,001 to 399,999</td>
<td>$15,000.05 to $19,999.95 ($0.05/profile)</td>
</tr>
</tbody>
</table>
<h3 id="ip-enrichment-api-pricing">IP Enrichment API Pricing</h3>
<p><strong>IP Enrichment API:</strong> Search an IP address and return location, company, and other associated data. (Cost: 1 credit)</p>
<table>
<thead>
<tr>
<th>Payment Cycle</th>
<th>Tier</th>
<th>Credits</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>Monthly</td>
<td>1</td>
<td>1,325 to 5,000</td>
<td>$95.40 to $360.00 ($0.072/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>5,001 to 10,000</td>
<td>$300.06 to $600.00 ($0.06/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>10,001 to 20,833</td>
<td>$480.05 to $1,000.00 ($0.048/profile)</td>
</tr>
<tr>
<td>Annual</td>
<td>1</td>
<td>15,900 to 60,000</td>
<td>$954.00 to $3,600.00 ($0.06/profile)</td>
</tr>
<tr>
<td></td>
<td>2</td>
<td>60,001 to 120,000</td>
<td>$3,000.05 to $6,000.00 ($0.05/profile)</td>
</tr>
<tr>
<td></td>
<td>3</td>
<td>120,001 to 249,999</td>
<td>$4,800.04 to $9,999.96 ($0.04/profile)</td>
</tr>
</tbody>
</table>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/data</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/AjTheJuiceMan</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">PeopleDataLabs data is good. They have very high coverage but only update their data monthly. So you’ll miss out on any data changes that happen in between these monthly updates. As you’re building a marketing app, you might need data such as social media posts and activity of people. But PDL doesn’t provide that. They provide company firmographics and people data like job history, academic background etc...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/data/comments/1as058c/whats_your_experience_with_peoples_data_lab/ncclqcb/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="is-people-data-labs-worth-it">Is People Data Labs worth it?</h2>
<p>The short answer is still no. For what you’re paying, there is a lot that could be better. And honestly, I’m still not fully on board with the price either.</p>
<p>Why? Let me explain.</p>
<h3 id="1-premium-pricing">1. Premium pricing</h3>
<p>People Data Labs has a proven track record of providing quality, accurate data. Their premium price is based on their breadth of data and their position in the market. But that does not automatically make it a good buy.</p>
<p>The cost per profile on the basic paid person plan is still <strong>$0.28</strong>. If you’re a startup or a lean sales team, that number adds up fast. Even annual Person pricing only gets down to <strong>$0.20</strong> at the top self-serve tier.</p>
<p>And now Person Identify is even harder to justify. At <strong>$0.55 to $0.50 per match</strong> on monthly pricing, you really need high downstream value per record for the math to work.</p>
<h3 id="2-data-recency">2. Data recency</h3>
<p>People Data Labs’ breadth is real. So is the tradeoff. Their data is not built around real-time recrawl on every query.</p>
<p>That matters more than people admit. When I was running data-heavy GTM systems, stale org charts and stale job changes were where a lot of waste came from. Not because the vendor was bad. Because batch-updated data has a shelf life.</p>
<p>The Reddit comment above gets at the same issue pretty cleanly: good coverage, monthly updates. That can be enough for analytics. It is often not enough for timing-sensitive outbound.</p>
<h3 id="3-steep-learning-curve">3. Steep learning curve</h3>
<p>Most companies turn to data providers because they want the provider to handle the ugly part. You pay to reduce internal mess.</p>
<p>But if you have to spend a good chunk of time understanding credit logic, field bundles, product-specific pricing, and API behavior just to forecast spend, that convenience starts to evaporate. A lot of the value from a data vendor is not just the data. It is whether your team can use it without creating a finance problem.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Entrepreneur</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/sbrands20</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">A valuable asset, understanding your audience is crucial. It's essential to invest time comprehending their data framework. Moreover, possessing development skills is advantageous, given that they typically offer only an API and a rudimentary query builder.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Entrepreneur/comments/1asgkb6/anybody_used_people_data_labs_for_customer/l02b3cw/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>The intent here isn’t to question People Data Labs’ quality. By all means, they’re a reputable provider. But I still have to ask if their service is worth the price.</p>
<p>For me, the answer is no.</p>
<p>If you are paying a premium price, you should not also be paying a premium in complexity.</p>
<h2 id="is-there-a-better-option">Is there a better option?</h2>
<p>I am here to tell you People Data Labs isn’t the only major player in the market. Before anything, assess your data needs. After you are confident in what you’re looking for, the only thing left to do is browse your options.</p>
<p>Here is an updated, simmered-down list:</p>
<ol>
<li><strong><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> (Best for competitive intelligence + enrichment):</strong> NinjaPear is what I’d point people to now if they want something more modern than the old enrichment-only stack. It does person and company enrichment, but the real difference is that it also has customer data, competitor mapping, company monitoring, and spreadsheet-native workflows. If your job is revenue, not just enrichment, that matters.</li>
<li><strong>Proxycurl (sunset, legacy mention):</strong> I’m keeping this in here because the older version of this article referenced it heavily, and that context still matters. Proxycurl API has been sunset. The founder behind Proxycurl is now building NinjaPear. So if you came here looking for the modern successor, that successor is NinjaPear.</li>
<li><strong><a href="https://reachstream.com/?ref=nubela.co">ReachStream</a> (Cheapest):</strong> ReachStream is a B2B sales and marketing data platform offering a simple UI where you can view contact and company profiles. I would still verify data depth before committing.</li>
<li><strong><a href="https://brightdata.com/?ref=nubela.co">Bright Data</a> (Most Flexible):</strong> Bright Data gives you the raw infrastructure if you want to build your own collection system. That flexibility comes with operational overhead.</li>
<li><strong><a href="https://www.uplead.com/?ref=nubela.co">UpLead</a> (Easy to buy, easy to use):</strong> UpLead is easier for non-technical teams that want prospecting data without a heavy API-first setup.</li>
</ol>
<p>If you want the old Proxycurl angle in one sentence: what used to be the “better API economics” argument has effectively moved to NinjaPear, just with a much broader product scope now.</p>
<h2 id="people-data-labs-vs-ninjapear-pricing">People Data Labs vs NinjaPear pricing</h2>
<p><img alt="NinjaPear pricing screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/ae7b6f22e006-1.webp" /></p>
<p>Here’s the updated side-by-side. This is not a perfect apples-to-apples comparison because the products are not identical. PDL is mostly a classic person/company/IP data vendor. NinjaPear is a broader competitive intelligence and enrichment platform. Still, if what you care about is whether you are overpaying for data access, this is the practical comparison.</p>
<table>
<thead>
<tr>
<th>Product</th>
<th>Entry Price</th>
<th>How Usage Works</th>
<th>Best For</th>
<th>Data Quality</th>
<th>Pricing Clarity</th>
<th>Ease of Use</th>
<th>Overall</th>
</tr>
</thead>
<tbody>
<tr>
<td>People Data Labs Person Pro</td>
<td>$98/mo</td>
<td>350 monthly credits, ~$0.28 per person record</td>
<td>Teams that need broad person data coverage and can tolerate complexity</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.17/5</strong></td>
</tr>
<tr>
<td>People Data Labs Company Pro</td>
<td>$100/mo</td>
<td>1,000 monthly credits, ~$0.10 per company record</td>
<td>Company enrichment at scale</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.33/5</strong></td>
</tr>
<tr>
<td><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> Starter</td>
<td>$49/mo</td>
<td>2,500 shared monthly credits, multi-product usage</td>
<td>Teams that want enrichment plus competitive intelligence</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.00/5</strong></td>
</tr>
<tr>
<td>NinjaPear Growth</td>
<td>$299/mo</td>
<td>25,000 shared monthly credits across products</td>
<td>GTM teams doing prospecting, monitoring, and account research</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.00/5</strong></td>
</tr>
</tbody>
</table>
<p>A few specifics from NinjaPear’s current pricing page:</p>
<ul>
<li>Starter: <strong>$49/mo</strong> for <strong>2,500 credits</strong></li>
<li>Growth: <strong>$299/mo</strong> for <strong>25,000 credits</strong></li>
<li>Pro: <strong>$899/mo</strong> for <strong>89,900 credits</strong></li>
<li>Ultra: <strong>$1,899/mo</strong> for <strong>211,000 credits</strong></li>
<li>Person Profile endpoint: <strong>3 credits/call</strong></li>
<li>Company Details endpoint: <strong>3 credits/call</strong></li>
<li>Company Updates: <strong>2 credits/call</strong></li>
<li>Customer Listing: <strong>1 credit/request + 2 credits/customer returned</strong></li>
</ul>
<p>This is the part I care about most: with NinjaPear, the credits are shared across products. That is a much saner model if your workflow spans research, prospecting, monitoring, and enrichment instead of just hammering one endpoint all day.</p>
<h2 id="what-changed-from-proxycurl">What changed from Proxycurl?</h2>
<p>Since the older draft leaned hard on Proxycurl, this deserves one clean note instead of pretending history did not happen.</p>
<p>Proxycurl API has been sunset. I’m not deleting it from the article because it was part of the original comparison, and the economics point behind it was fair at the time. But the relevant thing in 2026 is that the founder behind Proxycurl is now building NinjaPear, and NinjaPear is where that product energy went.</p>
<p><img alt="NinjaPear homepage screenshot" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/2e375d322c4c-1.webp" /></p>
<p>The practical difference is that NinjaPear is not trying to be just another person/company enrichment vendor. It is trying to answer harder GTM questions:</p>
<ul>
<li>Who sells to whom?</li>
<li>Which competitors matter?</li>
<li>What changed at a target account this week?</li>
<li>Which people at similar companies should I talk to?</li>
</ul>
<p>That is a different category of value than just “give me a profile JSON.”</p>
<h2 id="final-thoughts">Final Thoughts</h2>
<p>You do not have to break your bank to meet your data needs. While People Data Labs is still respected for data breadth and quality, their pricing continues to stick out.</p>
<p>The updated research did not soften my view. If anything, the current Person Identify pricing made it worse. And once you factor in field bundles, credit mechanics, and the reality that not every use case can tolerate monthly-updated data, the value proposition gets narrow fast.</p>
<p>If you specifically need PDL’s coverage and your unit economics can support it, fine. Buy it with open eyes.</p>
<p>If you mostly need a modern data product that helps revenue teams actually move, I’d look at NinjaPear first.</p>
<p>That’s the natural next step here. Pull up your real workflow, not a vendor demo, and price it out on both sides. Run 20 actual lookups you care about. If PDL still wins after that, great. If not, you just saved yourself a very expensive habit.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="is-people-data-labs-free">Is People Data Labs free?</h4>
<p>People Data Labs is not a fully free service. They do have a free plan with limited records, and they currently offer <strong>30-day trials with 500 API credits</strong> for supported products. To get unobfuscated contact data and premium fields, you still need a paid plan.</p>
<h4 id="is-people-data-labs-legit">Is People Data Labs legit?</h4>
<p>Yes. People Data Labs is a well-known data provider in the market. My issue is not legitimacy. It is whether the pricing and product tradeoffs make sense for your use case.</p>
<h4 id="where-does-people-data-labs-get-its-data">Where does People Data Labs get its data?</h4>
<p>People Data Labs says it aggregates public web data and partner data sources, then structures that into person, company, and IP datasets and APIs.</p>
<h4 id="who-owns-people-data-labs">Who owns People Data Labs?</h4>
<p>People Data Labs is a privately held company founded in 2015 by Sean Thorne and Joseph Drinkwater.</p>
<h4 id="is-people-data-labs-a-data-broker">Is People Data Labs a data broker?</h4>
<p>Yes, People Data Labs has been described and registered as a data broker in certain legal contexts, including Texas.</p>
<h4 id="what-was-the-people-data-labs-data-breach">What was the People Data Labs data breach?</h4>
<p>In 2019, a large PDL dataset was reported as exposed on the dark web. Reports at the time cited roughly <strong>1.2 billion records</strong>. That incident is part of the company’s history, whether or not it affects your buying decision today.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Top 11 People Data Labs Alternatives &amp; Competitors ]]></title>
        <description><![CDATA[ Discover People Data Labs alternatives and competitors. ReachStream, Bright Data, and Proxycurl. Find best free &amp; paid data providers similar to People Data Labs. ]]></description>
        <link>https://nubela.co/blog/top-people-data-labs-alternatives-competitors/</link>
        <guid isPermaLink="false">672ad2401cb59d0001b17772</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Wed, 06 Nov 2024 03:17:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_417-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Are you searching for a solution that can fetch B2B profile data at scale? Or maybe you read about People Data Labs, and now you want to explore alternatives. A quick search online, and you'll find a lot of websites filled with customer reviews, and simmered down lists that really do no good. What you need is a comprehensive list of alternatives, judged under the right parameters.</p>
<p>In this article, I will first establish some important metrics that great B2B data enrichment providers MUST have. Then, it's time for all the alternatives to be put up against these metrics so you know exactly where each stands out and where they may fall short. I will also highlight the pros and cons of each provider platform, so you know what you're getting yourself into.</p>
<p>Here's a quick glance at the alternatives to People Data Labs, compared and ranked across defined metrics.</p>
<table>
<thead>
<tr>
<th>Provider</th>
<th>Freshness</th>
<th>Data Points</th>
<th>Legal Compliance</th>
<th style="text-align: right;">Starting Price</th>
<th style="text-align: right;">Approx. Cost / Profile</th>
</tr>
</thead>
<tbody>
<tr>
<td>People Data Labs</td>
<td>Monthly dataset updates by default</td>
<td>200+ profile fields</td>
<td>GDPR, CCPA, SOC 2, ISO 27001</td>
<td style="text-align: right;">$98/mo for 350 profiles</td>
<td style="text-align: right;">$0.28</td>
</tr>
<tr>
<td>Proxycurl (sunset)</td>
<td>Live scrape, &lt;=29 days, or historical</td>
<td>Broad people + company enrichment</td>
<td>GDPR, CCPA</td>
<td style="text-align: right;">$49/mo for 2,500 profiles</td>
<td style="text-align: right;">$0.02</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Live monitoring + enrichment workflows</td>
<td>Customer, company, employee, competitor, updates</td>
<td>Built without LinkedIn scraping</td>
<td style="text-align: right;">3-day free trial, 10 credits</td>
<td style="text-align: right;">Usage-based</td>
</tr>
<tr>
<td>ReachStream</td>
<td>Monthly updates</td>
<td>20+ contact and company fields</td>
<td>GDPR, CCPA, ACMA, EDPS, CAN-SPAM</td>
<td style="text-align: right;">$99/mo for 5,000 profiles</td>
<td style="text-align: right;">$0.02</td>
</tr>
<tr>
<td>Coresignal</td>
<td>Monthly datasets, separate live API option</td>
<td>Strong company / employee datasets, weaker contact data</td>
<td>GDPR, CCPA</td>
<td style="text-align: right;">$800/mo</td>
<td style="text-align: right;">N/A</td>
</tr>
<tr>
<td>Bright Data</td>
<td>Your own live scraping, monthly datasets also available</td>
<td>Any public-web field you can collect</td>
<td>GDPR, CCPA</td>
<td style="text-align: right;">Datasets from $250 / 100K records</td>
<td style="text-align: right;">$0.0025</td>
</tr>
<tr>
<td>PhantomBuster</td>
<td>Live only</td>
<td>Private-profile scraping workflows</td>
<td>GDPR</td>
<td style="text-align: right;">$59/mo starter pricing page</td>
<td style="text-align: right;">Varies by workflow</td>
</tr>
<tr>
<td>UpLead</td>
<td>Monthly refresh cadence</td>
<td>People, company, verified emails, intent</td>
<td>GDPR, CCPA</td>
<td style="text-align: right;">$99/mo</td>
<td style="text-align: right;">$0.60</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td>Change-detection updates</td>
<td>Company, contacts, intent, engagement data</td>
<td>GDPR, CCPA, ISO 27001</td>
<td style="text-align: right;">Custom / sales-led</td>
<td style="text-align: right;">N/A</td>
</tr>
<tr>
<td>Lusha</td>
<td>Regular updates, exact cadence unclear</td>
<td>People + company + contact data</td>
<td>GDPR, CCPA, ISO 27701</td>
<td style="text-align: right;">$37.45/mo billed yearly</td>
<td style="text-align: right;">Credit-based</td>
</tr>
<tr>
<td>Xverum</td>
<td>Regular updates, not clearly specified</td>
<td>Firmographics, employee and company profiles</td>
<td>GDPR, CCPA</td>
<td style="text-align: right;">Quote-based</td>
<td style="text-align: right;">N/A</td>
</tr>
<tr>
<td>Revelio Labs</td>
<td>Monthly, with weekly or daily select feeds</td>
<td>Workforce dynamics, company and people profiles</td>
<td>GDPR</td>
<td style="text-align: right;">Quote-based</td>
<td style="text-align: right;">N/A</td>
</tr>
<tr>
<td>Versium</td>
<td>Regular updates, cadence not clearly specified</td>
<td>B2B + B2C enrichment, identity, predictive data</td>
<td>GDPR</td>
<td style="text-align: right;">Starts at &lt;$0.02 per match credit on subscription plans</td>
<td style="text-align: right;">Credit-based</td>
</tr>
</tbody>
</table>
<p>For those seeking a detailed analysis, I got you covered too! But first let's look at what metrics we should be judging the alternatives against and why.</p>
<h2 id="b2b-data-enrichment-provider-metrics">B2B data enrichment provider metrics</h2>
<h3 id="freshness">Freshness</h3>
<p>The idea that everyone wants fresh, live data is only true sometimes. The right provider allows customers to control the freshness of data, offering cheaper data when freshness is not a concern.</p>
<p>For example, if you are looking for job posting data, you need fresh data. However, cached data would suffice if you only wanted to match a company URL with its name because a company's name and URL will only change occasionally.</p>
<p>When exploring the different providers, understand their data freshness guarantee. Review their documentation and determine whether they provide the option to control data retrieval from cache or to scrape live.</p>
<h3 id="data-points">Data points</h3>
<p>Currently, you might only be looking for a specific set of data points. Even if you've identified a provider that caters your needs for now, you might need additional data points in the future. Consider committing to a provider with an exhaustive set of data points so you don't accrue technical debt from day one.</p>
<p>We've heard countless stories of people having to switch providers after realizing the limited data points available or having to engage different providers for different sets of data, making their workflow a mess.</p>
<h3 id="legal-compliance">Legal compliance</h3>
<p>Generally, you won't get into legal trouble even if your data provider fails to legally comply. If anything, the providers are the ones who'll get into trouble. What you don't want, is having to migrate your already-integrated applications and workflow when something does happen.</p>
<p>And so, it's best to find a provider that is legally scraping data. After all, <a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">web scraping is indeed legal</a> per the US court ruling. GDPR and CCPA are the basic compliance standards for the data industry.</p>
<h3 id="pricing">Pricing</h3>
<p>Even if you are in a small or a large company, pricing matters. As a small company, you need pricing flexibility based on what you use and not get tied down to a fixed plan. As a larger company, you will benefit from good enterprise packages to ensure that your large-scale data operations do not incur uncontrollable costs.</p>
<p>For this article, I will be comparing the cheapest monthly plan of each provider:</p>
<ol>
<li>Get the number of profiles available via that monthly plan.</li>
<li>Calculate the cost per profile.</li>
</ol>
<p>Of course, the more expensive monthly and annual plans would lower the cost per profile.</p>
<p>Before going in detail on all the competitors and alternatives of People Data Labs, let's first look at what People Data Labs has going for them.</p>
<h2 id="people-data-labs"><a href="https://www.peopledatalabs.com/?ref=nubela.co">People Data Labs</a></h2>
<p><img alt="People Data Labs landing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/4a398b3dac45.webp" /></p>
<p>People Data Labs (PDL) scrapes public data and works with third-party partners to get private data. Then it packages this data into datasets that customers can call using APIs. It isn't developer-focused, but with quite a comprehensive range of data points available, it's arguably the most complete in the list. Though they are guilty of breaking down one data point into many granular forms, which inflate the absolute quantity.</p>
<p>Now, let's look at PDL objectively through our metrics:</p>
<ul>
<li><strong>Data Freshness:</strong> APIs are called using PDL's Datasets, which are updated monthly by default.</li>
<li><strong>Data Points:</strong> People Data Labs provides a plethora of data points. It is arguably the most complete data points provider on the list. The company offers &gt;200 data points per profile, but they achieve this number by splitting the data down to their most granular forms. For example, a single location address is split into 12 different fields. Some examples: <code>location_street_address</code>, <code>location_address_line_2</code>, <code>location_continent</code>, <code>location_country</code>, <code>location_region</code>, etc.</li>
<li><strong>Legal Compliance:</strong> People Data Labs has an edge with additional compliance besides GDPR and CCPA. PDL complies with GDPR, CCPA, SOC 2 and ISO 27001 regulations.</li>
<li><strong><a href="https://www.peopledatalabs.com/pricing/person?ref=nubela.co">Pricing</a>:</strong> Their Pro plan starts at $98/mo for 350 profiles ($0.28/profile).</li>
</ul>
<p>People Data Labs has also faced a fair amount of critical reviews by past users on their high price tag, data recency and usage.</p>
<h4 id="pros-and-cons-of-people-data-labs">Pros and Cons of People Data Labs</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Large datasets on multiple data points.</li>
<li>Plug-and-play model allows for immediate consumption.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>At $0.25 per match, it's expensive to utilize PDL services.</li>
<li>Pre-collected databases compromise fresh data.</li>
<li>History of security issues, <a href="https://cybernews.com/security/people-data-labs-data-leak/?ref=nubela.co">PDL data breach 2019</a>.</li>
</ul>
<p>Now, that we've had our appetizer, onto our entree. Here are the best alternatives to People Data Labs.</p>
<h2 id="11-best-people-data-labs-competitors-and-alternatives-a-detailed-analysis">11 Best People Data Labs Competitors and Alternatives, A Detailed Analysis</h2>
<h3 id="1-proxycurl-historical-pick-now-sunset">1. <a href="http://nubela.co/?ref=nubela.co">Proxycurl</a> (Historical pick, now sunset)</h3>
<p>Proxycurl is still worth mentioning because many people still search for it by name when comparing People Data Labs alternatives.</p>
<p>But to be completely clear: <strong>Proxycurl is no more. It is sunset. Do not build anything new on it.</strong> The relevant replacement path now is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>.</p>
<p>Originally, Proxycurl was a developer-focused company that provided a huge portfolio of API endpoints which scraped and enriched profiles, providing a huge amount of data points. Depending on their use cases, customers could use Proxycurl's APIs flexibly and integrate them into any existing applications and workflows. Proxycurl also sold datasets of person and company profiles with millions of samples for enterprise customers looking for scale.</p>
<p>This is why Proxycurl used to rank highly here:</p>
<ul>
<li><strong>Data Freshness:</strong> Proxycurl provided flexibility in choosing dataset freshness. Customers could choose between freshly-scraped data, data 29 days old or younger, or historical data that was older than 29 days.</li>
<li><strong>Data Points:</strong> Proxycurl's data was comprehensive and provided coverage for both people and company profiles. People's profiles included contact information, work email and even personal email.</li>
<li><strong>Legal Compliance:</strong> Proxycurl operated under GDPR and CCPA frameworks.</li>
<li><strong>Pricing:</strong> Proxycurl's Starter plan used to begin from $49/mo for 2500 profiles ($0.02/profile).</li>
</ul>
<h4 id="pros-and-cons-of-proxycurl">Pros and Cons of Proxycurl</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>API crawls were dispatched on-demand and made in real-time for fresh data.</li>
<li>Flexibility in data freshness.</li>
<li>Affordable price plans.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>This is now legacy information only because Proxycurl is shut down.</li>
</ul>
<p>If you came here looking for the modern continuation, skip to the NinjaPear section below.</p>
<h3 id="2-ninjapear-what-replaced-proxycurl">2. <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> (What replaced Proxycurl)</h3>
<p><img alt="NinjaPear landing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/68c81321340e.webp" /></p>
<p>NinjaPear is the product we are building now, and it deserves its own section instead of being smuggled in as a footnote.</p>
<p>It is not a rebrand of Proxycurl. The model is different.</p>
<p>Proxycurl was heavily associated with LinkedIn-centric enrichment workflows. NinjaPear is built around the company website as the canonical object. From there, it maps customers, competitors, employee profiles from public sources, company details, and live updates across blogs, X, and website changes.</p>
<p>That difference matters.</p>
<p>If your use case is, "give me a giant static people database," People Data Labs still makes sense. If your use case is, "tell me who a company sells to, who it competes with, what changed this week, and who the right people are," NinjaPear is much closer to how modern GTM teams actually work.</p>
<p>A few current details worth knowing:</p>
<ul>
<li>3-day free trial</li>
<li>10 credits included</li>
<li>No credit card required</li>
<li>Usage-based pricing instead of forcing a big annual contract</li>
</ul>
<p>NinjaPear also has a wider product surface than a normal enrichment vendor:</p>
<ul>
<li><a href="https://nubela.co/companies?ref=nubela.co">Customer API</a></li>
<li><a href="https://nubela.co/companies?ref=nubela.co">Company API</a></li>
<li><a href="https://nubela.co/companies?ref=nubela.co">Employee API</a></li>
<li><a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a></li>
<li><a href="https://nubela.co/companies?ref=nubela.co">Competitor API</a></li>
</ul>
<p>Where I think NinjaPear is strongest:</p>
<ul>
<li><strong>Data Freshness:</strong> better for live workflows because the product includes monitoring and change detection, not just static enrichment.</li>
<li><strong>Data Points:</strong> different from PDL in a good way. Less obsession with field count, more focus on company relationships, public-web profiles, and market movement.</li>
<li><strong>Legal Compliance:</strong> built without depending on LinkedIn scraping.</li>
<li><strong>Pricing:</strong> easier to test without getting dragged into enterprise procurement too early.</li>
</ul>
<h4 id="pros-and-cons-of-ninjapear">Pros and Cons of NinjaPear</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Built for customer graphs, competitor graphs, company monitoring, and signal-based workflows.</li>
<li>Better fit for AI agents and modern GTM workflows than most legacy dataset vendors.</li>
<li>Easy to test with a free trial.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Not a one-for-one replacement if all you want is a giant legacy-style person database.</li>
<li>If your workflow starts and ends with batch person enrichment, you should still test it alongside PDL or Coresignal.</li>
</ul>
<h3 id="3-reachstream-cheapest">3. <a href="https://reachstream.com/?ref=nubela.co">ReachStream</a> (Cheapest 💰)</h3>
<p><img alt="ReachStream landing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/e607b1f3adcb.webp" /></p>
<p>ReachStream is a B2B sales and marketing data platform offering contact, company and technographic data for prospecting. Its main offering is a simple, user-friendly platform where you can view unlimited contact and company profiles, along with unlimited contact data updates for free. Additionally, ReachStream offers a monthly renewable freemium plan, letting users <a href="https://www.reachstream.com/pricing/?ref=nubela.co">test the application</a> and download data for free.</p>
<ul>
<li><strong>Data Freshness:</strong> Database is updated monthly through a 7-tier manual and AI verification process.</li>
<li><strong>Data Points:</strong> ReachStream also provides large, diverse datasets that are affordable for many businesses. It provides 20+ contact and company data points with comprehensive contact, firmographic and technographic data. It is a valid competitor to People Data Labs.</li>
<li><strong>Legal Compliance:</strong> ReachStream complies with GDPR, CCPA, ACMA, EDPS, CAN-SPAM, and ANTI CAN SPAM act regulations.</li>
<li><strong><a href="http://reachstream.com/pricing?ref=nubela.co">Pricing:</a></strong> Their Super Saver plan starts from $99/mo for 5000 profiles ($0.02/profile). It is the cheapest option per profile on the list.</li>
</ul>
<h4 id="pros-and-cons-of-reachstream">Pros and Cons of ReachStream:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>High database accuracy.</li>
<li>User-friendly platform.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Limited integrations with CRM platforms.</li>
<li>Limited set of features.</li>
</ul>
<h3 id="4-coresignal">4. <a href="http://coresignal.com/?ref=nubela.co">Coresignal</a></h3>
<p><img alt="Coresignal landing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/189c5bbd1d3f.webp" /></p>
<p>Coresignal's main offering is not data scraping but <a href="https://coresignal.com/buy-datasets/?ref=nubela.co">selling datasets</a>. Coresignal's datasets also consist of public and private data, which they either scraped themselves or acquired through third-party means. They also have live scraping APIs, but these are more limited in scope.</p>
<ul>
<li><strong>Data Freshness:</strong> Coresignal's datasets are updated monthly, a separate option is available for live scraping via APIs.</li>
<li><strong>Data Points:</strong> Coresignal is missing important data points such as contact info (phone numbers &amp; emails) from their datasets.</li>
<li><strong>Legal Compliance:</strong> The company is GDPR and CCPA compliant.</li>
<li><strong><a href="http://coresignal.com/pricing?ref=nubela.co">Pricing:</a></strong> Their Pro subscription plan starts from $800/mo.</li>
</ul>
<h4 id="pros-and-cons-of-coresignal">Pros and Cons of Coresignal:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Large dataset, aggregates data from a significant number of sources (20).</li>
<li>Provides a lot of data formats: JSON, Parquet, CSV, Other (upon request).</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Reports of customers receiving out-dated data.</li>
<li>"Real-time" API does not return data immediately.</li>
</ul>
<h3 id="5-bright-data-most-flexible">5. <a href="https://brightdata.com/?ref=nubela.co">Bright Data</a> (Most Flexible)</h3>
<p><img alt="Bright Data landing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/359b004f2ce8.webp" /></p>
<p>Bright Data does not scrape data for you but provides proxies for your own scrapers. They also sell templates of scrapers that you can build on. This is the most flexible alternative on the list, as you are building your own scraper. In 2022, they launched a new line of dataset products, with variety that rivals or even exceeds that of Coresignal's datasets.</p>
<ul>
<li><strong>Data Freshness:</strong> Since you build your own scraper, you have the autonomy on freshness. Their datasets are updated monthly by default.</li>
<li><strong>Data Points:</strong> The data points are similar to Coresignal, but they have more data points as Bright Data scrapes for any data visible on a website.</li>
<li><strong>Legal Compliance:</strong> Bright Data is GDPR and CCPA compliant.</li>
<li><strong><a href="http://brightdata.com/pricing?ref=nubela.co">Pricing:</a></strong> Their datasets pricing starts from $250 for 100K records ($0.0025/profile). This is still not a direct apples-to-apples comparison with standard enrichment vendors, but it is useful as a baseline.</li>
</ul>
<h4 id="pros-and-cons-of-bright-data">Pros and Cons of Bright Data:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Reliable and a variety of proxy services: residential proxies, ISP proxies, data center proxies, and mobile proxies.</li>
<li>Data collector and SERP API tools enable you to collect public data in real-time.</li>
<li>Automated IP address rotation allows scraping target sites more consistently and efficiently.</li>
<li>Added flexibility as you build your own scraper.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Some proxies are quite expensive and might be beyond budget for startups and small businesses.</li>
<li>The documentation provided for the usage of the software is complex.</li>
<li>Proper settings and implementations can take weeks to ensure everything functions correctly.</li>
</ul>
<h3 id="6-phantombuster">6. <a href="https://phantombuster.com/?ref=nubela.co">PhantomBuster</a></h3>
<p>PhantomBuster, another alternative to PDL, does offer scraping services, however, in a different way from the norm. They have you use your own accounts to scrape for private data. At this point, this in itself is already a red flag in legal compliance as it involves scraping private data. Private LinkedIn profiles return additional data that you can't get from public profiles, but with its own limitations: low rate limit and legal risk. Customers can only scrape so much per day before their account gets blocked. You definitely don't want that to happen.</p>
<ul>
<li><strong>Data Freshness:</strong> PhantomBuster only scrapes live data.</li>
<li><strong>Data Points:</strong> It is an added advantage having private profile data via private profile scraping, however, it has limited scraping frequency.</li>
<li><strong>Legal Compliance:</strong> PhantomBuster is only GDPR-compliant, and rightly so, as they scrape private profiles, which is a huge risk in itself.</li>
<li><strong><a href="http://phantombuster.com/pricing?ref=nubela.co">Pricing:</a></strong> Their pricing page now starts from $59/mo, with a 14-day free trial and no credit card required.</li>
</ul>
<h4 id="pros-and-cons-of-phantombuster">Pros and Cons of PhantomBuster:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Allows automation on repetitive tasks.</li>
<li>Supports business scaling by providing valuable insights through data analysis.</li>
<li>Supports integration with multiple platforms.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Only supports Hubspot, and limited options for other CRMs.</li>
<li>Unable to bypass LinkedIn's limit or connection invite restrictions.</li>
<li>Safety concerns as PhantomBuster requires you to download a Chrome extension and access your cookies to enter LinkedIn.</li>
</ul>
<h3 id="7-uplead-highest-rated-by-g2">7. <a href="https://www.uplead.com/?ref=nubela.co">UpLead</a> (Highest Rated by G2 ⭐️)</h3>
<p>UpLead is the highest rated B2B data provider in the industry, known for its high ROI and user-friendly platform. Instead of providing raw web scraped datasets, they provide a clean prospecting list, which you can then plug into your CRM. Uplead prides itself with its dedication to providing accurate data, backed up by real-time verified emails, mobile numbers and intent data.</p>
<ul>
<li><strong>Data Points:</strong> People and company profile, along with verified email addresses and intent data.</li>
<li><strong>Data Freshness:</strong> UpLead updates their datasets on a monthly basis. Limited information is available regarding the specifics.</li>
<li><strong>Legal Compliance:</strong> UpLead complies with GDPR and CCPA regulations.</li>
<li><strong><a href="https://www.uplead.com/pricing/?ref=nubela.co">Pricing:</a></strong> Their Essentials plan starts from $99/mo ($0.60/profile).</li>
</ul>
<h4 id="pros-and-cons-of-uplead">Pros and Cons of UpLead:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Commendable user-interface, allows very precise searches.</li>
<li>Provides detailed contact information (email and phone number).</li>
<li>Excellent tracking of lookups.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Limited database coverage, only has leads from North America.</li>
<li>The number of "valid" leads cuts down the amount of total leads. Even if a large amount of leads are generated, only a small % of them are pursuable "valid" leads.</li>
</ul>
<h3 id="8-zoominfo">8. <a href="http://zoominfo.com/?ref=nubela.co">ZoomInfo</a></h3>
<p>Similar to Coresignal, Zoominfo also sells access to its database on a subscription basis. It deals with B2B data, extensive company and contact information, and is equipped with advanced search capabilities and integration options. Potential customers purchase subscriptions to gain access to its database of people and companies to sales, marketing, and recruiting professionals.</p>
<ul>
<li><strong>Data Freshness:</strong> Zoominfo manually updates their database based on change detection.</li>
<li><strong>Data points:</strong> Zoominfo provides company profile, business contacts and companies contact database, intent data. They also generate and analyze customer interactions across communication channels, like sales calls, emails, and business websites.</li>
<li><strong>Legal Compliance:</strong> Similar to People Data Labs, Zoominfo is GDPR, CCPA, and ISO 27001 compliant.</li>
<li><strong><a href="http://zoominfo.com/pricing?ref=nubela.co">Pricing:</a></strong> Their product pricing remains sales-led and custom-quoted, rather than published as a simple self-serve monthly plan.</li>
</ul>
<h4 id="pros-and-cons-of-zoominfo">Pros and Cons of Zoominfo:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Accurate contact information, along with a large database.</li>
<li>Supports workflow automation.</li>
<li>Provides a granular view with advanced search options, along with intent data.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Expensive plans.</li>
<li>Users must expect a steep learning curve.</li>
<li>Customer service has received its fair share of criticism.</li>
</ul>
<h3 id="9-lusha">9. <a href="http://lusha.com/?ref=nubela.co">Lusha</a></h3>
<p>Lusha also sells access to its huge B2B database of contact information, including emails, phone numbers, and LinkedIn profiles, which are highly useful for sales, marketing, and recruitment professionals. The platform is primarily built for easy integration with popular CRM systems like Salesforce and HubSpot, offering lead enrichment and data retrieval.</p>
<ul>
<li><strong>Data Points:</strong> Lusha provides a full company and people profile.</li>
<li><strong>Data Freshness:</strong> Lusha relies on publicly available data sources and claims to update its data regularly, but the exact frequency or guarantees on data freshness are not always clear. The focus is on collecting verified, crowd-sourced contact details.</li>
<li><strong>Legal Compliance:</strong> Similar to Zoominfo, Lusha has GDPR, CCPA and ISO 27701 compliance.</li>
<li><strong><a href="http://lusha.com/pricing?ref=nubela.co">Pricing:</a></strong> Lusha's pricing page now shows a Starter plan from $37.45/mo billed yearly, with usage governed by credits rather than a clean profiles-per-month count.</li>
</ul>
<h4 id="pros-and-cons-of-lusha">Pros and Cons of Lusha:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Reasonable pricing for the quality of data it provides.</li>
<li>Interactive dashboard and allows seamless integration.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Instances of wrong information being served, posing trust issues.</li>
<li>Constantly poor customer support.</li>
</ul>
<h3 id="10-xverum">10. <a href="https://www.xverum.com/?ref=nubela.co">Xverum</a></h3>
<p>Like most on this list, Xverum provides access to its massive-scale open web data with an aim to help ML and SaaS platforms. Their datasets are focused on firmographic data, individual profiles, and other relevant public data.</p>
<ul>
<li><strong>Data Points:</strong> Firmographics, complete employee and company profile data.</li>
<li><strong>Data Freshness:</strong> While Xverum promises regular updates to its datasets, there is no specified period mentioned.</li>
<li><strong>Legal Compliance:</strong> Xverum complies with GDPR and CCPA regulations.</li>
<li><strong><a href="https://www.xverum.com/?ref=nubela.co">Pricing:</a></strong> Xverum does not publish straightforward pricing on the homepage or core dataset pages, so you have to reach out to their team for a quote.</li>
</ul>
<h4 id="pros-and-cons-of-xverum">Pros and Cons of Xverum:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>They offer API options, enabling smooth integration into marketing and sales tools.</li>
<li>Extensive targeting options, supporting businesses in building segmented, tailored lists.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Xverum does not publish its pricing structure openly, which can make budgeting and cost comparison challenging.</li>
<li>Data update periods are not transparent, businesses that rely on highly current data might need a provider with a data freshness guarantee.</li>
</ul>
<h3 id="11-revelio-labs">11. <a href="https://www.reveliolabs.com/?ref=nubela.co">Revelio Labs</a></h3>
<p>Revelio Labs standardizes public employment records to create a comprehensive HR database, pivotal for HR analytics and the data services industry. Revelio Labs does not provide raw datasets or provide scraping services. Instead, it provides workforce intelligence by analyzing publicly available workforce data. They do however, provide a dataset builder option where you can choose and filter parameters from their datasets.</p>
<ul>
<li><strong>Data Points:</strong> Revelio Labs provides workforce dynamics (aggregated workforce statistics), company and people profiles.</li>
<li><strong>Data Freshness:</strong> Their datasets are updated monthly, but they also offer weekly or daily data delivery for select feeds.</li>
<li><strong>Legal Compliance:</strong> Revelio Labs prominently markets workforce intelligence and data coverage, but does not publish transparent self-serve pricing.</li>
<li><strong><a href="https://www.reveliolabs.com/faq/?ref=nubela.co">Pricing:</a></strong> Similar to Xverum, Revelio Labs does not have public plans listed on their website. You have to go through a sales process.</li>
</ul>
<h4 id="pros-and-cons-of-revelio-labs">Pros and Cons of Revelio Labs:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Provides more than just datasets, workforce intelligence gives insights into company workforce trends, labor movements, and turnover.</li>
<li>Revelio's product covers a broad number of industries, with its predictive analysis allowing sectors like technology, finance, and healthcare to make informed decisions.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>No transparent pricing details available.</li>
<li>Limited to only providing workforce data and lacks broader B2B data.</li>
</ul>
<h3 id="12-versium">12. <a href="http://versium.com/?ref=nubela.co">Versium</a></h3>
<p>The final entry for People Data Labs alternative is Versium. Versium hosts rich datasets for both B2B and B2C marketers to address some of the biggest pain points in marketing and sales, figuring out who is likely to buy, and who will never buy. Versium's main services include data enrichment, identity resolution, and predictive modeling, to help companies optimize their marketing strategies.</p>
<ul>
<li><strong>Data Points:</strong> Versium also provides firmographics, enriched with people, company and job profiles.</li>
<li><strong>Data Freshness:</strong> Just like Xverum, Versium promises fresh data through regular updates, but fails to mention what time intervals they are updated.</li>
<li><strong>Legal Compliance:</strong> Versium is certainly not going over the mile with their data compliance as they are only GDPR compliant.</li>
<li><strong><a href="https://versium.com/pricing/?ref=nubela.co">Pricing:</a></strong> Versium now publishes pricing language that starts at <code>&lt;$0.02</code> per match credit on subscription plans, though actual packages still depend on volume and credit needs.</li>
</ul>
<h4 id="pros-and-cons-of-versium">Pros and Cons of Versium:</h4>
<p><strong>Pros:</strong></p>
<ul>
<li>Provides comprehensive data for both B2B and B2C companies.</li>
<li>Seamless integrations with major marketing platforms and CRMs.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Versium does not make simple apples-to-apples plan comparison easy.</li>
<li>Requires a learning curve to fully use all features.</li>
<li>Poor interface design.</li>
</ul>
<h2 id="so-whats-the-best-alternative-to-people-data-labs">So, what's the best alternative to People Data Labs?</h2>
<p>The original version of this article picked Proxycurl as the overall best alternative. That was true for its time. It is not current anymore.</p>
<p>If you want the closest thing to the old "developer-first, flexible, modern" spirit, the answer now is <strong>NinjaPear</strong>.</p>
<p>If you want the most complete traditional person dataset, People Data Labs still has a strong case.</p>
<p>If you want to build your own collection stack, Bright Data is still the most flexible option on this list.</p>
<p><strong>My current verdict:</strong> NinjaPear is the best alternative if your problem is not just enrichment, but actual GTM intelligence. That means customer graphs, competitor graphs, company monitoring, and public-web profile enrichment in one system. People Data Labs is still good at what it does, but it remains more of a batch dataset product than a live market-intelligence product.</p>
<p>Let us hear your data needs. Start with <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> if you want to test a more modern workflow, especially one that does not depend on LinkedIn as the center of your data model.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="is-people-data-labs-legit">Is People Data Labs Legit?</h4>
<p>People Data Labs is a reputed data provider in the industry. They have a solid customer rating of 4.6 out of 5.</p>
<h4 id="how-can-i-verify-data-accuracy-from-a-data-provider">How can I verify data accuracy from a data provider?</h4>
<p>Most providers offer demos or free credits upon signup which allow you to verify data quality firsthand. Do your due diligence and test their data accuracy, freshness, and relevance before subscribing to a provider. A good indicator is to look for platforms with real-time verification features, which help maintain a high standard of data accuracy.</p>
<h4 id="how-frequently-should-a-b2b-data-provider-update-their-datasets">How frequently should a B2B data provider update their datasets?</h4>
<p>Regular updates are important for fields that rely on current information, and in an ideal world, real-time update would be most desirable. However, any provider that updates their data monthly or shorter intervals than that are meeting the industry standard.</p>
<p>With NinjaPear, the bigger idea is different: not just updating a static dataset, but monitoring companies and surfacing changes as they happen.</p>
<h4 id="how-can-i-evaluate-the-roi-of-a-b2b-data-provider">How can I evaluate the ROI of a B2B data provider?</h4>
<p>Consider lead conversion rates, data accuracy, integration efficiency, and cost savings over time. While not immediate, higher-quality data should yield better results in the long term. It should also save your time on lead research and improve outreach success rates.</p>
<h4 id="whats-the-difference-between-intent-data-and-enrichment-data">What’s the difference between intent data and enrichment data?</h4>
<p>Intent data shows a prospect's likelihood of engaging with a service based on behaviors. Providers include companies like UpLead and ZoomInfo. Enrichment data adds depth to existing profiles with information like contact details, job roles, and company specifics. This is what providers like People Data Labs do well, and where NinjaPear takes a different angle by combining enrichment with company and relationship intelligence.</p>
<h4 id="what-replaced-proxycurl">What replaced Proxycurl?</h4>
<p><a href="https://nubela.co/?ref=nubela.co">Proxycurl</a> is sunset. The product that replaced it is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. If you were previously evaluating Proxycurl as a People Data Labs alternative, use NinjaPear as the current point of comparison instead.</p>
<h4 id="do-i-still-need-a-linkedin-based-data-vendor-in-2026">Do I still need a LinkedIn-based data vendor in 2026?</h4>
<p>Less than most teams think. If your workflow still depends on LinkedIn URLs being the primary object in your data stack, I think that is increasingly brittle. The more durable model is to center the company website and public-web identity graph, then enrich outward from there.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Top 5 Alternatives to People Data Labs in 2024 ]]></title>
        <description><![CDATA[ Discover People Data Labs alternatives and competitors. ReachStream, Bright Data, and Proxycurl. Find best free &amp; paid data providers similar to People Data Labs. ]]></description>
        <link>https://nubela.co/blog/people-data-labs-alternatives-competitors-2-2/</link>
        <guid isPermaLink="false">64a50d8e4897f70001c44142</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Wed, 06 Nov 2024 03:17:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_416.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<blockquote>
<p><strong>Looking for the latest version of this comparison?</strong> Read the updated article here: <a href="https://nubela.co/blog/top-people-data-labs-alternatives-competitors/">Top People Data Labs Alternatives &amp; Competitors</a></p>
</blockquote>
<p>Are you searching for a solution that can fetch B2B profile data at scale? Or maybe you read about People Data Labs, and now you want to explore alternatives. Either way, you've come to the right place.</p>
<p>Let's dive deep into alternatives to People Data Labs and which ones you want to pick when.</p>
<h2 id="methodology">Methodology</h2>
<p>First, we'll outline some important metrics that great B2B data enrichment providers should have. Then, we'll compare People Data Labs and each alternative to give you a good picture of the playing field. Finally, we compare the six providers based on each metric one by one.</p>
<h2 id="b2b-data-enrichment-provider-metrics">B2B data enrichment provider metrics</h2>
<h3 id="freshness">Freshness</h3>
<p>Common wisdom states that everyone wants fresh, live data. But that's only sometimes true. The pinnacle of a provider is that it allows customers to control the freshness of data received, offering cheaper data when freshness is not a concern.</p>
<p>For example, if you are looking for job posting data, you do need fresh data. However, cached data would suffice if you only wanted to match a company URL with its name because a company's name and URL will only change occasionally.</p>
<p><strong>When exploring the different providers, understand their data freshness guarantee</strong>. Review their documentation and determine whether they provide the option to control data retrieval from cache or to scrape live.</p>
<h3 id="data-points">Data points</h3>
<p>Currently, you might only be looking for a specific set of data points. Even if you've identified that one provider which offers what you need for now, you might need additional data points in the future. Consider committing to a provider with an exhaustive set of data points so you don't accrue technical debt from day one.</p>
<p>We've heard countless stories of people having to switch providers after realizing the limited data points available or having to engage different providers for different sets of data - making their workflow a mess.</p>
<h3 id="legal-compliance">Legal compliance</h3>
<p>Generally, you won't get into legal trouble if something bad happens regarding your data provider. If anything, the providers are the ones who'll get into trouble (<a href="[https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional](https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional) Social Network-scraping-service-is-sued-by-Professional Social Network/">if they employ illegal tactics like Mantheos</a>). What you don't want, though, is having to migrate your already-integrated applications and workflow when something does happen.</p>
<p>And so, it's best to find a provider that is legally scraping data. After all, <a href="[https://nubela.co/blog/is-Professional](https://nubela.co/blog/is-Professional) Social Network-scraping-legal/">web scraping is indeed legal</a> per the US court ruling.</p>
<h3 id="pricing">Pricing</h3>
<p>No matter if you are in a small or large company, pricing matters. As a small company, you need pricing flexibility based on what you use and not get tied down to a fixed plan. As a larger company, you will benefit from good enterprise packages to ensure that your large-scale data operations do not incur uncontrollable costs.</p>
<h2 id="a-summary-of-people-data-labs-five-alternatives">A summary of People Data Labs &amp; five alternatives</h2>
<h3 id="people-data-labs">People Data Labs</h3>
<p>People Data Labs scrapes public data and works with third-party partners to get private data. Then it packages this data into datasets that customers can call using APIs. It isn't developer-focused, but with quite a comprehensive range of data points available, it's arguably the most complete in the list. Though they are guilty of breaking down one data point into many granular forms, which inflate the absolute quantity.</p>
<h3 id="proxycurl">Proxycurl</h3>
<p>Proxycurl is a developer-focused company that provides <a href="https://nubela.co/blog/ultimate-guide-to-all-21-proxycurl-apis-enrich-people-company-profiles/">a huge portfolio of API endpoints</a> which scrape and enrich profiles, providing a huge amount of data points. Depending on their use cases, customers can use Proxycurl's APIs flexibly and integrate them into any existing applications and workflows. Proxycurl also sells datasets of person and company profiles with millions of samples for enterprise customers looking for scale.</p>
<h3 id="reachstream">ReachStream</h3>
<p>ReachStream is a B2B sales and marketing data platform offering contact, company and technographic data for prospecting. Its main offering is a simple, user-friendly platform where you can view unlimited contact and company profiles, along with unlimited contact data updates for free. Additionally, ReachStream offers a monthly renewable freemium plan, letting users <a href="https://www.reachstream.com/pricing/?utm_source=proxycurl&utm_medium=Colton+Randolph&utm_campaign=link+exchange+opportunity&utm_id=Pricing">test the application</a> and download data for free.</p>
<p>ReachStream provides large, diverse datasets that are affordable for many businesses. A valid competitor to People Data Labs.</p>
<h3 id="coresignal">Coresignal</h3>
<p>Coresignal's main offering is not data scraping but <a href="https://coresignal.com/buy-datasets/?ref=nubela.co">selling datasets</a>. Coresignal's datasets also consist of public and private data, which they either scraped themselves or acquired through third-party means. They also have live scraping APIs, but these are more limited in scope.</p>
<h3 id="bright-data">Bright Data</h3>
<p>Bright Data does not scrape data for you but provides proxies for your own scrapers. They also sell templates of scrapers that you can build on. In 2022 they did launch a new line of dataset products, whose variety rivals or even exceeds that of Coresignal's datasets.</p>
<h3 id="phantombuster">PhantomBuster</h3>
<p>PhantomBuster does offer scraping services, however, in a different way from the norm. Instead, they have you use your own accounts to scrape for private data. At this point, this in itself is already a red flag in legal compliance as it involves scraping private data. Private profiles do return additional data that you can't get from public profiles; however, it has limitations: Low rate limit and legal risk. Customers can only scrape 80 profiles per day before their account gets blocked by Professional Social Network. You definitely don't want that to happen!</p>
<h2 id="reviewing-each-provider-against-the-metrics">Reviewing each provider against the metrics</h2>
<p>Now comes the fun part, diving into the metrics and comparing the providers against each other.</p>
<h3 id="freshness_1">Freshness</h3>
<p><img alt="How the five alternatives stack up against People Data Labs in terms of freshness" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/09/TLC_5_PDL_alternatives_Update_Freshness.png" /></p>
<p>Most providers let customers pull data from their datasets via APIs, with data only updated monthly. The exception is Proxycurl, which allows for flexibility here: You can request cached or up-to-a-month-old data.</p>
<ul>
<li><strong>People Data Labs</strong> - Datasets from which APIs are called are updated monthly by default</li>
<li><strong>Proxycurl</strong> - Flexibility in choosing between freshly-scraped data, &lt;= 29 days old or possibly &gt; 29 days old</li>
<li><strong>ReachStream</strong> - Database is updated monthly through a 7-tier manual and AI verification process</li>
<li><strong>Coresignal</strong> - Datasets are updated monthly; a separate option is available for live scraping via APIs</li>
<li><strong>Bright Data</strong> - Autonomy on freshness is in the customer's hands as they build the scrapers; datasets are updated monthly by default</li>
<li><strong>PhantomBuster</strong> - Only scraped live</li>
</ul>
<h3 id="data-points_1">Data points</h3>
<p><img alt="How the five alternatives stack up against People Data Labs in terms of data points" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/09/TLC_5_PDL_alternatives_Update_Data-points.png" /></p>
<p>People Data Labs brags about having &gt;200 data points per profile, but they achieve this number by splitting the data down to their most granular forms. For example, a single location address is split into 12 different fields! Some examples: <code>location_street_address</code>, <code>location_address_line_2</code>, <code>location_continent</code>, <code>location_country</code>, <code>location_region</code>, etc. If we clean up the data types for comparison, Proxycurl comes in second with a comprehensive suite of data fields after People Data Labs.</p>
<ul>
<li><strong>People Data Labs</strong> - Arguably the most complete on the list</li>
<li><strong>Proxycurl</strong> - Comprehensive coverage for both people and companies profiles</li>
<li><strong>ReachStream</strong> - 20+ contact and company data points with comprehensive contact, firmographic and technographic data</li>
<li><strong>Coresignal</strong> - Missing important data points such as contact info (phone numbers &amp; emails)</li>
<li><strong>Bright Data</strong> - Similar to Coresignal; however, they have more data points than Coresignal as Bright Data scrapes for any data visible on a website</li>
<li><strong>PhantomBuster</strong> - Advantageous in having private profile data via private profile scraping; however, limited exactly because of that as platforms greatly limit scraping frequency</li>
</ul>
<h3 id="legal-compliance_1">Legal compliance</h3>
<p><img alt="How the five alternatives stack up against People Data Labs in terms of compliance" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/09/TLC_5_PDL_alternatives_Update_Legal-compliance.png" /></p>
<p><a href="[https://nubela.co/blog/is-Professional](https://nubela.co/blog/is-Professional) Social Network-scraping-gdpr-compliant/">GDPR</a> and CCPA are the basic compliance standards for the data industry. People Data Labs has an edge with additional compliance besides GDPR and CCPA. On the other end, PhantomBuster is only GDPR-compliant, rightly so, as they scrape private profiles - which is a huge risk in itself. <a href="[https://nubela.co/blog/is-Professional](https://nubela.co/blog/is-Professional) Social Network-scraping-legal/">Web scraping is legal</a> with court precedent; however, there's a grey line, and <a href="[https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional](https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional) Social Network-scraping-service-is-sued-by-Professional Social Network/">that grey line is scraping private profiles</a>.</p>
<ul>
<li><strong>People Data Labs</strong> - GDPR, CCPA, SOC 2 &amp; ISO 27001-compliant</li>
<li><strong>Proxycurl</strong> - GDPR &amp; CCPA-compliant</li>
<li><strong>ReachStream</strong> - GDPR, CCPA, ACMA, EDPS, CAN-SPAM, and ANTI CAN SPAM act-compliant</li>
<li><strong>Coresignal</strong> - GDPR &amp; CCPA-compliant</li>
<li><strong>Bright Data</strong> - GDPR &amp; CCPA-compliant</li>
<li><strong>PhantomBuster</strong> - GDPR-compliant only</li>
</ul>
<h3 id="pricing_1">Pricing</h3>
<p><img alt="How the five alternatives stack up against People Data Labs in terms of pricing" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/09/TLC_5_PDL_alternatives_Update_Pricing.png" /></p>
<p>Here, we are comparing the cheapest monthly plan of each provider:</p>
<ol>
<li>Get the number of profiles available via that monthly plan</li>
<li>Calculate the cost per profile.<br />
   Of course, the more expensive monthly and annual plans would lower the cost per profile.</li>
</ol>
<p>And here are the results:</p>
<ul>
<li><strong>People Data Labs</strong> - $98/mo for 350 profiles ($0.28/profile)</li>
<li><strong>Proxycurl</strong> - $49/mo for 2500 profiles ($0.02/profile)</li>
<li><strong>ReachStream</strong> - $99/mo for 5000 profiles ($0.02/profile)</li>
<li><strong>Coresignal</strong> - from $800/mo <em>(incomplete pricing info)</em></li>
<li><strong>Bright Data</strong> - $500/mo for 86k profiles ($0.006/profile) <em>(not a direct comparison as this pricing is for their scraper builder)</em></li>
<li><strong>PhantomBuster</strong> - $69/mo for 1470 profiles ($0.047/profile)</li>
</ul>
<p>There you go! We tried to compare them as faithfully as possible across all metrics to give you a good picture of comparing People Data Labs and the other providers.</p>
<h2 id="so-whos-the-best-alternative-to-people-data-labs">So, who's the best alternative to People Data Labs?</h2>
<p>Our verdict:</p>
<blockquote>
<p>Proxycurl is the most flexible yet with high data quality for your data needs. The pricing is also very competitive.</p>
</blockquote>
<p>And here's the summary comparing all providers:</p>
<ul>
<li><strong>People Data Labs</strong> - If you only care about the maximum number of data points, you can choose this one, but it's so expensive that it's probably not worth it, especially since you cannot get fresh data.</li>
<li><strong>Proxycurl</strong> - Probably your best choice for most use cases. Inexpensive, built for developers, and lets you choose your data freshness level.</li>
<li><strong>ReachStream</strong> - provides large, diverse datasets that are affordable for many businesses. A valid competitor for People Data Labs.</li>
<li><strong>Coresignal</strong> - You are required to buy in bulk, but it does offer a lot of datasets.</li>
<li><strong>Bright Data</strong> - Go here if you want to build and host your own scraper.</li>
<li><strong>PhantomBuster</strong> - Probably avoid because of legal compliance issues.</li>
</ul>
<p>Proxycurl is the best alternative to People Data Labs. Not only that, but you'll be better off with Proxyurl than you might be with People Data Labs.</p>
<p>Proxycurl's advantages:</p>
<ul>
<li><a href="https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/">Data freshness</a></li>
<li><a href="https://nubela.co/blog/how-to-maximize-throughput-on-proxycurl/">Rate limit</a></li>
<li>Pricing</li>
<li>Accuracy</li>
</ul>
<p>People Data Labs' advantages:</p>
<ul>
<li>Slightly more comprehensive list of data points. But <a href="https://nubela.co/blog/ultimate-guide-to-all-21-proxycurl-apis-enrich-people-company-profiles/">check out Proxycurl's</a> while you're at it. It's an impressive array of its own!</li>
</ul>
<h3 id="try-proxycurl-today">Try Proxycurl today</h3>
<p>Ready to try Proxycurl? <a href="https://nubela.co/proxycurl/?ref=nubela.co">Create an account today!</a></p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ People Data Labs Reviews: Features, Pricing and Comparison ]]></title>
        <description><![CDATA[ ⭐️⭐️⭐️⭐️ Rating: 4/5. Explore a detailed People Data Labs reviews on their pricing, features and how they compare to Proxycurl, another leading industry provider. ]]></description>
        <link>https://nubela.co/blog/people-data-labs-reviews/</link>
        <guid isPermaLink="false">62b4372688fa7f0001068595</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Fri, 01 Nov 2024 01:35:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_415.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>People Data Labs reviews are mostly positive for one reason: the product does solve a real data problem. But after years of buying, testing, and integrating B2B data vendors myself, I think the real question is narrower. <strong>Is People Data Labs worth the price for your specific use case, or are you paying enterprise money for data that is good enough, not fresh enough?</strong></p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Recruitment</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/not_you_again53</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">We've actually integrated PDL into a few client ATSs and tbh the company data is hit or miss - their person data is solid but for company enrichment you're better off mixing vendors. Crustdata's API is fast af but check their coverage for your specific industries first. For 5M+ records I'd honestly run parallel tests with small batches before committing...</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Recruitment/comments/1mx2vlf/whats_the_best_data_vendor_to_enrich_millions_of/na2bk6o/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Navigating the world of data solutions can be overwhelming, especially when it comes to choosing the right provider. If you've been in the industry long enough, you have likely come across <a href="https://www.peopledatalabs.com/?ref=nubela.co">People Data Labs</a>. They're a well-known B2B data provider, offering detailed profiles of individuals and companies to help businesses build data-driven solutions. From HR and recruitment to marketing and risk management, PDL's datasets cater to a wide range of industries. But how does their service truly measure up in practice?</p>
<p>To answer that question, I combed through multiple product review sites and noticed a common thread: while honest, the reviews were often divided and didn't address all the key concerns. It became clear that there wasn't a comprehensive review out there to help make an informed decision about People Data Labs. This gap prompted me to create a complete review that digs into every aspect of PDL's service, from pricing and features to real customer feedback.</p>
<p>That brings us to this article, where I'll review People Data Labs against key factors that matter most when evaluating a data provider. Plus, I'll compare PDL with Proxycurl, the product I used to know very well, and with <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, where that work has since moved. <strong>Quick callout before we go further: Proxycurl has been sunset.</strong> I am retaining those comparison points in this article because they explain the original tradeoffs clearly, but where it matters, I will also note how NinjaPear changes the picture now.</p>
<p>For those looking for a quick People Data Labs review, here's a snapshot.</p>
<table>
<thead>
<tr>
<th>Key Factors</th>
<th>People Data Labs</th>
<th>Proxycurl / NinjaPear context</th>
</tr>
</thead>
<tbody>
<tr>
<td>Price</td>
<td>Pro starts at $98/mo, starting at 350 monthly records</td>
<td>NinjaPear has usage-based pricing with no monthly minimums on the core platform</td>
</tr>
<tr>
<td>Data Points Variety</td>
<td>Offers Personal Emails ✅ Offers Phone Numbers ✅ Offers Work Emails ❌ Search functionality via API ✅</td>
<td>Proxycurl historically offered work emails; NinjaPear now covers person, company, and work email enrichment plus competitive intelligence data</td>
</tr>
<tr>
<td>Data Freshness</td>
<td>Data Freshness Guarantee ❌</td>
<td>Proxycurl historically emphasized freshness guarantees; NinjaPear is built around fresher public-web enrichment and live company-change monitoring</td>
</tr>
<tr>
<td>Data Updates and Flexibility</td>
<td>Updated Monthly by default ✅</td>
<td>NinjaPear is API-first and built around real-time pulls and monitoring workflows rather than fixed monthly dataset thinking</td>
</tr>
<tr>
<td>Ease of use</td>
<td>Requires considerable technical expertise (steep learning curve) 📈</td>
<td>NinjaPear is much easier to trial because it includes UI workflows, spreadsheet-style prospecting, and API access on the same platform</td>
</tr>
<tr>
<td>GDPR/ CCPA compliance</td>
<td>Yes ✅</td>
<td>NinjaPear emphasizes publicly sourced data and product-level transparency ✅</td>
</tr>
<tr>
<td>Data Formats</td>
<td>JSON ✅</td>
<td>JSON/API plus app workflows ✅</td>
</tr>
</tbody>
</table>
<p>Now, we will go through a detailed review and comparison.</p>
<h2 id="customer-reviews-of-people-data-labs">Customer Reviews of People Data Labs ⭐️⭐️⭐️⭐️</h2>
<p>The <a href="https://www.g2.com/products/people-data-labs/reviews?ref=nubela.co">company reviews</a> are commendable. Most customers have praised People Data Labs for their accuracy and appreciated their professional team. That part seems consistent across review sites.</p>
<blockquote>
<p><em>"It just works. Set it up one time and it's continued to work with basically no interruption or maintenance."</em><br />
-<a href="https://www.g2.com/products/people-data-labs/reviews?ref=nubela.co#survey-response-4779372">Anonymous Reviewer, Computer Software</a></p>
<p><em>"Their work teams listen attentively to the concern of our satisfaction, they are people of heart."</em><br />
-<a href="https://www.g2.com/products/people-data-labs/reviews?page=2&ref=nubela.co">Jonny Martin, CTO</a></p>
</blockquote>
<p>On the flip side, there are recurring concerns around poor data recency, high price, and a steep learning curve. The price complaint comes up a lot, and not just from tiny companies.</p>
<blockquote>
<p><em>"It's a really good tool, unfortunately it's just a bit pricey."</em><br />
-<a href="https://slashdot.org/software/p/People-Data-Labs/?page=1&ref=nubela.co#reviews">Gloria, Lead Engineer</a></p>
<p><em>"I like everything but the price. It's hard for a small company to get started especially if they need a premium datapoint."</em><br />
-<a href="https://slashdot.org/software/p/People-Data-Labs/?page=2&ref=nubela.co#reviews">Anonymous Reviewer, CEO</a></p>
</blockquote>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/AI_Agents</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/ChatEngineer</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Have you looked at People Data Labs, Hunter.io, or Proxycurl? PDL updates their database constantly. The issue with live crawling LinkedIn is aggressive rate-limiting now.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/AI_Agents/comments/1r1r799/alternative_to_exa_for_people_data/o4rl748/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>For those just starting out, or anyone who prioritizes up-to-date information, that might be a dealbreaker. Despite these recurring cons, the overall reviews are positive.</p>
<h2 id="pricing-review">Pricing Review ⭐️⭐️⭐️</h2>
<p>People Data Labs offers three different <a href="https://www.peopledatalabs.com/pricing/person?ref=nubela.co">pricing plans</a>: Free, Pro, and Enterprise. Based on their current pricing page, the <strong>Pro plan starts at $98/month</strong> and includes <strong>starting at 350 monthly records</strong>. Enterprise pricing is custom.</p>
<p><img alt="People Data Labs pricing page" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/eb5002159f76.webp" /></p>
<p>The free tier allows up to <strong>100 monthly records</strong>. The Pro tier includes contact data, premium fields, and email support. On paper, that is a reasonable self-serve entry point for a real API business.</p>
<p>The problem is not that $98/month is outrageous. The problem is what happens after you move past the entry tier and start caring about premium fields, match rates, recency, and production-scale usage. That is where B2B data bills have a way of becoming slippery.</p>
<p>This is also where the old Proxycurl comparison still matters historically. Proxycurl used to compete much more directly on low-friction API access and freshness-oriented positioning. Today, if you are evaluating the post-Proxycurl landscape, <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> takes a different angle. It is not just a person-enrichment API. It combines person and company enrichment with customer data, competitor data, monitoring, and work email workflows on the same platform.</p>
<p>If your use case is <strong>only</strong> person enrichment at scale, PDL can still make sense. If your use case is broader revenue intelligence, the pricing comparison needs to include the fact that you may otherwise end up stitching together 2 to 4 separate vendors.</p>
<h2 id="features-review">Features Review</h2>
<p>Before we review People Data Labs features and contrast them with Proxycurl and NinjaPear, let's get something out of the way. People Data Labs does not position itself as a live professional-profile scraping service. Their core business is buying, combining, normalizing, and reselling large volumes of people and company data through APIs and data licenses.</p>
<p>That distinction matters.</p>
<p>Proxycurl, back when it was active, leaned much harder into live retrieval and freshness tradeoffs. NinjaPear, which is where that line of product thinking has evolved, is broader again. It is not trying to be a clone of old Proxycurl. It is trying to be a live map of business relationships and company change data, with enrichment as one layer of the stack.</p>
<p>With that, now it's time for the People Data Labs feature review.</p>
<h3 id="1-data-freshness">1. Data Freshness ⭐️⭐️⭐️</h3>
<p>People Data Labs offers trackable updates through their APIs. By trackable, I mean fields such as job last updated and location last updated can help you reason about staleness. But that is not the same thing as a strong freshness guarantee. In practice, you are querying a very large pre-built database.</p>
<p>Here is what a few People Data Labs reviewers had to say about data freshness:</p>
<blockquote>
<p><em>"The problem of data recency is one area for constant improvement."</em><br />
-<a href="https://www.g2.com/products/people-data-labs/reviews?ref=nubela.co">John Zacharakis, Director of Data Products</a></p>
<p><em>"The data is not always perfect in terms of freshness or accuracy, but it is within a tolerable range."</em><br />
-<a href="https://www.g2.com/products/people-data-labs/reviews?page=2&ref=nubela.co#survey-response-5068487">Anonymous Reviewer, Computer Software</a></p>
</blockquote>
<p>That is basically the PDL tradeoff in one sentence: <strong>huge dataset, useful coverage, tolerable staleness</strong>.</p>
<p>Back when Proxycurl was active, this was one of the clearest differences. Proxycurl explicitly competed on fresher returned profiles. Today, NinjaPear approaches the same problem differently. For enrichment, it pulls from public web sources and for account intelligence it adds products like the <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a>, which tracks company blogs, X posts, and website changes as they happen. That means if your problem is not just "who is this person?" but also "what changed at this company this week?" then the comparison stops being PDL vs a profile API and starts becoming PDL vs a broader intelligence workflow.</p>
<table>
<thead>
<tr>
<th>Vendor</th>
<th>Data freshness</th>
<th>Ease of verifying recency</th>
<th>Notes</th>
<th>Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>People Data Labs</td>
<td>Monthly-style database updates, field-level recency clues</td>
<td>Moderate</td>
<td>Good enough for many enrichment jobs, weaker if timing matters a lot</td>
<td>⭐⭐⭐☆☆</td>
</tr>
<tr>
<td>Proxycurl (sunset)</td>
<td>Historically freshness-forward</td>
<td>High</td>
<td>Kept here for historical context only</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Fresh public-web enrichment plus live monitoring products</td>
<td>High</td>
<td>Better fit when you need current signals, not just stored records</td>
<td>⭐⭐⭐⭐☆</td>
</tr>
</tbody>
</table>
<h3 id="2-data-points-variety">2. Data Points Variety ⭐️⭐️⭐️⭐️</h3>
<p>People Data Labs enriches people profiles with contact data. It provides personal emails and phone numbers, and it has wide appeal because its dataset serves recruiting, identity, and general enrichment use cases.</p>
<p>Proxycurl used to take it a step further by offering verified work emails alongside person/profile enrichment. NinjaPear now carries that baton forward in a broader form: person profile enrichment, company profile enrichment, work email lookup, employee count, customer intelligence, competitor intelligence, and company monitoring.</p>
<p>So the comparison has changed.</p>
<p>If you only care about bulk people records, PDL still looks strong. If you care about <strong>connecting people data to company context and go-to-market motion</strong>, NinjaPear is a more interesting product today because it is working on the actual commercial workflow, not just the raw record.</p>
<table>
<thead>
<tr>
<th>People Data Labs</th>
<th>Proxycurl / NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td>Offers Personal Emails ✅</td>
<td>Offers Personal Emails / person enrichment ✅</td>
</tr>
<tr>
<td>Offers Phone Numbers ✅</td>
<td>Workflows depend on endpoint, but broader enrichment stack ✅</td>
</tr>
<tr>
<td>Offers Work Emails ❌</td>
<td>Proxycurl historically did; NinjaPear includes a work email finder ✅</td>
</tr>
<tr>
<td>Search functionality via API ✅</td>
<td>API plus sheet/app workflows ✅</td>
</tr>
</tbody>
</table>
<h3 id="3-data-updates-and-flexibility">3. Data Updates and Flexibility ⭐️⭐️⭐️⭐️</h3>
<p>This aspect is rarely talked about in customer reviews, but it matters a lot once you are operating at scale. People Data Labs updates their datasets regularly, with monthly cadence language appearing often in how buyers describe the product. Access to updated data is a sign of a good provider. But a great provider also gives you flexibility around <strong>how</strong> you consume the data.</p>
<p>That was one of the old arguments for Proxycurl. You could think about freshness as a query-time choice instead of just a database property.</p>
<p>NinjaPear inherits that same bias in a different form. The platform is not just "here is a static record." It is "here is a company profile, here is who they sell to, here are their competitors, here are the latest changes they made on their site and X account." That is much closer to how an actual sales or research team works.</p>
<p>So yes, PDL updates data. But it is still mostly a <strong>database product</strong>. NinjaPear is closer to an <strong>intelligence product</strong>.</p>
<table>
<thead>
<tr>
<th>People Data Labs</th>
<th>Proxycurl / NinjaPear context</th>
</tr>
</thead>
<tbody>
<tr>
<td>Updated monthly by default ✅</td>
<td>Proxycurl historically emphasized freshness control; NinjaPear emphasizes live workflows and monitoring ✅</td>
</tr>
<tr>
<td>Inflexible compared with live-query models ❌</td>
<td>Greater flexibility when current context matters ✅</td>
</tr>
</tbody>
</table>
<h2 id="ease-of-use">Ease of Use ⭐️⭐️⭐️⭐️</h2>
<p>People Data Labs reviewers had much to say about the platform's learning curve. While many were happy with the results, several pointed out the platform's requirement for a fairly technical user. Here are a few customer reviews from SourceForge / Slashdot listings.</p>
<blockquote>
<p><em>"There was a bit of a learning curve initially when getting familiar with all the features and functionalities of the platform."</em><br />
-<a href="https://slashdot.org/software/p/People-Data-Labs/?page=1&ref=nubela.co#reviews">Jurnee, CEO</a></p>
<p><em>"It is a bit technical to use so if you're not a techie be prepared to learn something new."</em><br />
-<a href="https://slashdot.org/software/p/People-Data-Labs/?page=1&ref=nubela.co#reviews">Anonymous Reviewer, Founder</a></p>
</blockquote>
<p>This does not diminish the value PDL provides. It is just an honest warning label.</p>
<p>Historically, Proxycurl won points here because the API docs were straightforward and the value proposition was easy to grasp. But again, Proxycurl is sunset.</p>
<p>NinjaPear is easier for a different reason. It does not force every user into an API-only mental model. You can use the API, but you can also use <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>, which is basically a spreadsheet with superpowers, or work inside product flows like company monitoring and customer discovery. That means a revenue team can test value faster before they commit engineering resources.</p>
<p>That is a real product-design improvement. I like APIs, obviously. I built with them for years. But a lot of teams do not need another raw API first. They need a faster path from data to action.</p>
<h2 id="use-cases-for-people-data-labs">Use Cases for People Data Labs</h2>
<p>The list of industries that do not use data would be shorter than those who do. HR and recruitment, sales and marketing, and risk management are major use cases for People Data Labs.</p>
<ul>
<li><strong>HR and Recruitment:</strong> widen candidate data range with contact information and resume attributes.</li>
<li><strong>Sales &amp; Marketing:</strong> enhance leads for sales and marketing platforms.</li>
<li><strong>Risk Management:</strong> identify and cross-reference individual information for fraud detection and credit risk work.</li>
</ul>
<p>These are still valid use cases. But this is where I would separate PDL from NinjaPear cleanly.</p>
<p>Use PDL when you want a broad people-data provider that fits enrichment, modeling, or identity-style workloads.</p>
<p>Use NinjaPear when you need go-to-market intelligence on top of enrichment, especially things like:</p>
<ul>
<li>customer discovery</li>
<li>competitor discovery</li>
<li>company change monitoring</li>
<li>company profiles and employee counts</li>
<li>work email lookup tied to prospecting workflows</li>
</ul>
<p>That difference sounds subtle until you pay for the stack yourself. Then it becomes very obvious.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/AI_Agents</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/HotSoup2me</span>
<span style="color:#878a8c;">· ▲ 1</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Proxycurl? They are no longer in service</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/AI_Agents/comments/1r1r799/alternative_to_exa_for_people_data/o8r2mw8/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That Reddit comment is blunt, but fair. So let me say it plainly too: <strong>if you came here specifically looking for a current Proxycurl alternative inside this article, the modern continuation of that story is NinjaPear, not Proxycurl itself.</strong></p>
<h2 id="people-data-labs-comparison-table">People Data Labs comparison table</h2>
<p>Since this article compares 3 products in practice, here is the cleaner side-by-side.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th>Data quality</th>
<th>Pricing</th>
<th>Ease of use</th>
<th>API</th>
<th>Breadth of workflow</th>
<th>Average</th>
</tr>
</thead>
<tbody>
<tr>
<td>People Data Labs</td>
<td>Large-scale people/company enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.50/5</td>
</tr>
<tr>
<td>Proxycurl (sunset)</td>
<td>Historical reference: freshness-oriented profile enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>3.67/5</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>GTM intelligence plus enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.33/5</td>
</tr>
</tbody>
</table>
<h2 id="the-final-verdict">The Final Verdict</h2>
<p>Overall, my People Data Labs review still lands at <strong>4 out of 5</strong> if your expectations are calibrated correctly.</p>
<p>PDL is a serious data vendor. The biggest deal breaker for many businesses, especially those operating on tighter budgets, is the price once real usage begins to scale. The second issue is recency. The third is that you may still need other tools around it, depending on what you are actually trying to do.</p>
<p>That is why I would frame the buying decision like this:</p>
<ul>
<li>Choose <strong>People Data Labs</strong> if you want a mature, broad data provider and your workflow can tolerate database-style recency.</li>
<li>Mourn <strong>Proxycurl</strong> briefly if that was the old benchmark you were using. It is sunset.</li>
<li>Look at <strong>NinjaPear</strong> if you want a more modern stack that connects enrichment to prospecting, monitoring, customer discovery, and competitive intelligence in one place.</li>
</ul>
<p>I have spent too much of my career watching teams buy "data" when what they actually needed was a faster path to revenue signal. Those are not the same thing.</p>
<p>If your problem is broader than raw enrichment, start a trial of NinjaPear and test the workflow end-to-end. Pull a company profile, monitor a target account, find its customers, then decide if you still need a standalone people database next to it. That is the honest next step.</p>
<h2 id="faqs">FAQs</h2>
<h4 id="is-people-data-labs-free">Is People Data Labs free?</h4>
<p>People Data Labs is not a free service in the way most buyers mean "free." They do have a free plan with up to <strong>100 monthly records</strong>, but the paid product starts at <strong>$98/month</strong> for the Pro tier, and serious usage moves beyond that quickly.</p>
<h4 id="where-does-people-data-labs-get-its-data-from">Where does People Data Labs get its data from?</h4>
<p>People Data Labs aggregates data from multiple public and commercial sources, then normalizes and serves it through APIs and data products. It is fundamentally a large-scale aggregation and packaging business.</p>
<h4 id="who-owns-people-data-labs">Who owns People Data Labs?</h4>
<p>People Data Labs is a privately held company founded in 2015 by Sean Thorne and Joseph Drinkwater.</p>
<h4 id="what-are-the-main-competitors-of-pdl">What are the main competitors of PDL?</h4>
<p>People Data Labs' main competitors depend on the job to be done. Historically that included Proxycurl, Clearbit, ZoomInfo, and Lusha. Today, for teams that care about enrichment plus go-to-market signal, NinjaPear deserves to be on that shortlist too.</p>
<h4 id="how-are-people-data-labs-and-ninjapear-different">How are People Data Labs and NinjaPear different?</h4>
<p>People Data Labs is primarily a broad data provider. NinjaPear is a broader B2B intelligence platform that includes enrichment, but also customer discovery, competitor mapping, company monitoring, work email lookup, and company context products. If you only want records, PDL may fit. If you want signal and workflow, NinjaPear is the more interesting comparison.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The LinkedIn API Pricing Guide You Need And How To Get Access ]]></title>
        <description><![CDATA[ We explored and did a breakdown of the various official Professional Social Network API pricing, including how to get access to them. ]]></description>
        <link>https://nubela.co/blog/the-linkedin-api-pricing-guide-you-need-and-how-to-get-access/</link>
        <guid isPermaLink="false">671f4cb81cb59d0001b172f5</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Mon, 28 Oct 2024 16:59:12 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_414.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you're trying to figure out LinkedIn API pricing and how to get access, here's the short version: the official LinkedIn API is useful for narrow, approved use cases, but most developers who want profile, company, or jobs data run into the same wall, restricted access, partner approvals, and pricing that is either opaque or clearly aimed at bigger teams.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Bubbleio</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Diligent_Fig4840</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">You can't do that with the linkedin APIs. Impossible to gain access to, trust me. You have to build a workaround.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Bubbleio/comments/1lps0t8/how_to_get_full_profile_access_for_linkedin_api/n10zrh8/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Having worked around enrichment and go-to-market data systems for years, I don't think the problem is that LinkedIn's APIs are bad. The problem is that most people reading a "LinkedIn API pricing" article are not actually trying to buy a marketing partner workflow. They want programmatic access to people, company, or job data now, and LinkedIn's approval model was not designed to make that easy.</p>
<p>The earlier version of this article was directionally right on that point. I'm keeping that spine intact. I am updating the parts that matter: the naming, the product landscape, and what to do now that Proxycurl has been sunset.</p>
<p>Here’s a cleaner comparison, and this time I am being explicit: the first four rows are LinkedIn products or LinkedIn-adjacent access routes. NinjaPear is <strong>not</strong> a LinkedIn API, does <strong>not</strong> scrape LinkedIn, and should be read as a separate B2B data alternative that covers many of the same downstream use cases.</p>
<table>
<thead>
<tr>
<th>Product / Route</th>
<th>Pricing</th>
<th>Uses</th>
<th>Access</th>
<th>Data Quality</th>
<th>Ease of Access</th>
<th>Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>LinkedIn People/Profile access</td>
<td>Custom / partner-led</td>
<td>Retrieve approved member profile data for approved workflows</td>
<td>Requires application and LinkedIn partnership</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>2.5/5</td>
</tr>
<tr>
<td>LinkedIn Company / Organization access</td>
<td>Custom / partner-led</td>
<td>Retrieve company info, organization data, and related firmographics</td>
<td>Requires LinkedIn partnership approval</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>2.5/5</td>
</tr>
<tr>
<td>LinkedIn Jobs API</td>
<td>Variable, based on usage volume</td>
<td>Extract job listings, search for relevant job postings</td>
<td>Limited to LinkedIn partner integrations</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>2.5/5</td>
</tr>
<tr>
<td>Sales Navigator</td>
<td>$99.99 to $149.99 per month, per user</td>
<td>Advanced search and insights for sales outreach</td>
<td>Via Sales Navigator subscription</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>3.75/5</td>
</tr>
<tr>
<td><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> Company API, <strong>not a LinkedIn API</strong></td>
<td>Credit-based, transparent</td>
<td>Company details, headcount, updates, funding, logo from public web sources</td>
<td>Self-serve</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.5/5</td>
</tr>
<tr>
<td>NinjaPear Employee API, <strong>not a LinkedIn API</strong></td>
<td>Credit-based, transparent</td>
<td>Person profile and work email enrichment from public sources</td>
<td>Self-serve</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>4.5/5</td>
</tr>
</tbody>
</table>
<p>That distinction matters.</p>
<p>If you need official LinkedIn functionality inside LinkedIn's rules, keep reading about the official APIs. If you need B2B data in a similar shape for enrichment, prospecting infrastructure, or account intelligence, you should evaluate a non-LinkedIn data vendor separately instead of pretending it is the same thing.</p>
<h2 id="types-of-linkedin-apistiers">Types of LinkedIn APIs/Tiers</h2>
<p>LinkedIn does not really sell one neat, public, developer-friendly API product. It sells access through programs, products, and partner tracks. That distinction matters because "can I technically call an endpoint?" and "can I get approved to call it for my business model?" are two different questions.</p>
<h3 id="1-api-for-linkedin-people-profiles">1. API for LinkedIn People Profiles</h3>
<p>If you need detailed personal data from LinkedIn users, like work history, education, skills, and other profile insights, the People Profile API is the obvious place to start. In practice, this is where most teams hit the wall first.</p>
<p>Important information provided:</p>
<ul>
<li>Name and URL of the profile</li>
<li>Experience at work and current title</li>
<li>Skills and recommendations</li>
<li>Education history</li>
</ul>
<p>If you're willing to put in the time and money to go through the approval process, this API can be excellent. For everyone else, it tends to be impractical, especially if your product is not already aligned with one of LinkedIn's preferred partner categories.</p>
<h3 id="2-api-for-linkedin-company-profiles">2. API for LinkedIn Company Profiles</h3>
<p>The LinkedIn Company Profile API is the natural tool for gathering business information listed on LinkedIn. That includes company name, industry, employee count, and headquarters-related data.</p>
<p>Important information provided:</p>
<ul>
<li>Company name and URL</li>
<li>Size and industry</li>
<li>Employee growth indicators</li>
<li>Headquarters location</li>
</ul>
<p>This API is strong for enterprise workflows tied closely to LinkedIn's ecosystem. It is much less friendly if you're a startup that just wants structured company data without a months-long business-development process.</p>
<h3 id="3-api-for-linkedin-jobs">3. API for LinkedIn Jobs</h3>
<p>Another useful part of the stack is the Jobs API. This is mainly relevant if you're building a job board, labor-market analytics workflow, or a recruiting product that needs job posting data.</p>
<p>Important information provided:</p>
<ul>
<li>Job title and description</li>
<li>Employer details</li>
<li>Location and job type</li>
<li>Posted and expiration dates</li>
</ul>
<p>Again, the pattern repeats. The functionality is real. The access is the bottleneck.</p>
<h3 id="4-api-for-linkedin-marketing">4. API for LinkedIn Marketing</h3>
<p>For ad workflows, LinkedIn's Marketing API is the piece that matters. It lets businesses create, manage, and measure LinkedIn ad campaigns.</p>
<p>Important information provided:</p>
<ul>
<li>Campaign creation and management</li>
<li>Performance metrics like clicks and impressions</li>
<li>Audience targeting by industry, title, and similar dimensions</li>
</ul>
<p>This one makes the most sense if you're already spending materially on LinkedIn Ads. For smaller teams, it usually does not solve the broader enrichment problem they came for in the first place.</p>
<h3 id="5-api-for-linkedin-learning">5. API for LinkedIn Learning</h3>
<p>LinkedIn Learning also has integration pathways for platforms that want course catalogs, enrollment, and progress tracking.</p>
<p>Important information provided:</p>
<ul>
<li>Course titles and descriptions</li>
<li>Enrollment status</li>
<li>Completion tracking</li>
</ul>
<p>This is a niche API. Useful, but not what most people searching for "LinkedIn API pricing" are actually after.</p>
<h2 id="details-of-each-linkedin-api">Details of Each LinkedIn API</h2>
<p>This is where most articles get vague. I'll keep it simple: pricing, use case, access, setup.</p>
<h3 id="1-linkedin-people-profile-api">1. LinkedIn People Profile API</h3>
<h3 id="pricing-of-this-linkedin-api">Pricing of this LinkedIn API</h3>
<p>The cost of the LinkedIn People Profile API is high mainly because it is not a clean self-serve SKU for most developers. Access generally comes through LinkedIn's partner structures and enterprise products, which means the real price is a mix of subscription cost, business-development friction, and time.</p>
<h4 id="applications">Applications:</h4>
<p>This API offers comprehensive LinkedIn profile information, such as:</p>
<ul>
<li>Full name</li>
<li>Job titles</li>
<li>Work experience</li>
<li>Qualifications and certifications</li>
<li>Education background</li>
</ul>
<p>It is best suited for businesses that need detailed professional identity data and already fit LinkedIn's approved use cases.</p>
<h4 id="how-to-get-access">How to Get Access:</h4>
<p>Gaining access is not as straightforward as signing up. You generally need to apply, wait for approval, and fit within a partner or approved product track.</p>
<ol>
<li>Apply through the relevant LinkedIn developer or partner program.</li>
<li>Wait for approval from LinkedIn.</li>
<li>If approved, receive credentials and product access tied to that program.</li>
</ol>
<h4 id="how-to-set-up">How to Set Up:</h4>
<p>Here’s a simple example of how you’d typically access data via a LinkedIn People Profile API endpoint:</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_linkedin_api_key&quot;
person_id = &quot;person_profile_id&quot;

url = f&quot;https://api.linkedin.com/v2/people/{person_id}&quot;

headers = {
    &quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;,
    &quot;Content-Type&quot;: &quot;application/json&quot;
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f&quot;Failed to retrieve profile: {response.status_code}&quot;)
</code></pre>
<p>However, the complex approval process and the enterprise-style commercial model make the official LinkedIn People Profile API hard to use for most teams.</p>
<h3 id="2-linkedin-company-profile-api">2. LinkedIn Company Profile API</h3>
<h3 id="pricing-of-this-linkedin-api_1">Pricing of this LinkedIn API</h3>
<p>The Company Profile API is one of those products where the practical issue is not just the monthly cost. It is the lack of a straightforward public pricing path for most developers.</p>
<h4 id="uses">Uses:</h4>
<p>The Company Profile API allows you to pull detailed information about companies, including:</p>
<ul>
<li>Company name</li>
<li>Industry classification</li>
<li>Number of employees</li>
<li>Revenue signals or related firmographic context</li>
<li>Growth trends</li>
</ul>
<p>This API is particularly useful for B2B marketing, sales prospecting, and competitive analysis.</p>
<h4 id="how-to-get-access_1">How to Get Access:</h4>
<p>Similar to the People Profile API, getting access typically requires an application to LinkedIn's partner or approved access programs.</p>
<ol>
<li>Apply to the relevant LinkedIn partner program.</li>
<li>Upon approval, LinkedIn provides your API credentials.</li>
</ol>
<h4 id="how-to-set-up_1">How to Set Up:</h4>
<p>Below is an example of how to set up the Company Profile API to fetch company data.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_linkedin_api_key&quot;
company_id = &quot;company_profile_id&quot;

url = f&quot;https://api.linkedin.com/v2/companies/{company_id}&quot;

headers = {
    &quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;,
    &quot;Content-Type&quot;: &quot;application/json&quot;
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    company_data = response.json()
    print(company_data)
else:
    print(f&quot;Failed to retrieve company profile: {response.status_code}&quot;)
</code></pre>
<h3 id="3-linkedin-jobs-api">3. LinkedIn Jobs API</h3>
<h3 id="pricing-of-this-linkedin-api_2">Pricing of this LinkedIn API</h3>
<p>LinkedIn's Jobs API pricing varies by usage, integration needs, and commercial arrangement. That usually means you will not get a satisfying answer from a pricing page alone.</p>
<h4 id="uses_1">Uses:</h4>
<p>This API is used to fetch job listings, which include:</p>
<ul>
<li>Job titles</li>
<li>Company details</li>
<li>Location</li>
<li>Employment type</li>
<li>Posted and expiration dates</li>
</ul>
<p>This is useful for companies building job aggregation or hiring workflows.</p>
<h4 id="how-to-get-access_2">How to Get Access:</h4>
<p>Access to the LinkedIn Jobs API also generally requires partnership or approved integration status.</p>
<ol>
<li>Apply for the relevant LinkedIn jobs or partner access.</li>
<li>Secure approval to receive your API key.</li>
</ol>
<h4 id="how-to-set-up_2">How to Set Up:</h4>
<p>Here’s how you’d typically set up a connection to LinkedIn’s Jobs API.</p>
<pre><code class="language-python">import requests

API_KEY = &quot;your_linkedin_api_key&quot;
job_id = &quot;job_listing_id&quot;

url = f&quot;https://api.linkedin.com/v2/jobs/{job_id}&quot;

headers = {
    &quot;Authorization&quot;: f&quot;Bearer {API_KEY}&quot;,
    &quot;Content-Type&quot;: &quot;application/json&quot;
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    job_data = response.json()
    print(job_data)
else:
    print(f&quot;Failed to retrieve job listing: {response.status_code}&quot;)
</code></pre>
<h2 id="cons-of-using-the-official-linkedin-apis">Cons of using the official LinkedIn APIs</h2>
<p>The biggest issue with LinkedIn's APIs is not that they do nothing. It's that they do very specific things within very specific business boundaries.</p>
<h3 id="1-pricing-is-high-or-unclear">1. Pricing is high or unclear</h3>
<p>One of the biggest downsides is the commercial model.</p>
<ul>
<li>Many LinkedIn API products are not sold with transparent, self-serve pricing.</li>
<li>Enterprise and partner arrangements can push the real cost much higher than a startup expects.</li>
<li>Sales Navigator itself is more straightforward, at roughly $99.99 to $149.99 per user per month, but that is a user tool, not a broad data API strategy.</li>
</ul>
<p>For small to mid-sized businesses, that is a real barrier.</p>
<h3 id="2-restricted-access">2. Restricted access</h3>
<p>Gaining access to LinkedIn’s APIs is not as simple as creating an account.</p>
<ul>
<li>You often need to apply and get approved.</li>
<li>Approval can take weeks or months.</li>
<li>LinkedIn can limit access based on your category, business model, and intended use.</li>
</ul>
<p>That slows down product timelines in a way most founders underestimate.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SaaS</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/ZorroGlitchero</span>
<span style="color:#878a8c;">· ▲ 8</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Go to rapidapi, there are many linkedIn data providers. Or you can create your own scraper using python and requests. But be careful, Linked In can ca catch you and ban your ip. But it you want to do less than 1000 request, i would say go for python. Regards.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SaaS/comments/12xwjft/linkedin_api_access/jhljany/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h3 id="3-limited-flexibility">3. Limited flexibility</h3>
<p>LinkedIn APIs come with scope restrictions.</p>
<ul>
<li>Certain data is only available for authenticated users.</li>
<li>Some use cases require explicit user permission.</li>
<li>Broader enrichment use cases often sit outside what LinkedIn wants to support directly.</li>
</ul>
<h3 id="4-complicated-setup-and-integration">4. Complicated setup and integration</h3>
<p>The technical setup is not terrible if you already know OAuth, API scopes, and enterprise vendor workflows. If you don't, it gets annoying fast.</p>
<ul>
<li>OAuth flows add friction.</li>
<li>Product-specific approvals add more friction.</li>
<li>Documentation can be clear on syntax but unclear on commercial eligibility.</li>
</ul>
<h3 id="5-long-approval-times">5. Long approval times</h3>
<p>This point deserves to stand alone because it changes build strategy.</p>
<p>If your team needs data this quarter, a multi-month approval cycle is not just inconvenient. It can kill the project.</p>
<h3 id="6-data-availability-and-permissions">6. Data availability and permissions</h3>
<p>LinkedIn's API access model also restricts what you can see depending on permissions, product scope, and user consent.</p>
<p>If your business depends on broad, repeatable coverage, this can materially reduce the value of the official route.</p>
<h2 id="proxycurl-and-what-changed">Proxycurl, and what changed</h2>
<p>The older version of this article recommended Proxycurl heavily. That was fair at the time.</p>
<blockquote>
<p><strong>Update:</strong> Proxycurl API has been sunset. The founder behind Proxycurl is now building NinjaPear. I am keeping the Proxycurl references here for historical context because they explain the old market shape, but if you're evaluating options today, the modern path is NinjaPear for self-serve B2B intelligence and enrichment from public sources, with <a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">none of the legal liability</a>.</p>
</blockquote>
<p>Proxycurl existed because there was a huge gap between what developers wanted from LinkedIn-shaped data and what the official LinkedIn API would actually let them do. That gap still exists. The brand changed. The underlying problem did not.</p>
<h2 id="why-ninjapear-is-now-the-better-fit">Why NinjaPear is now the better fit</h2>
<p>At this point, it should be obvious that the official LinkedIn APIs are strongest when your use case fits LinkedIn's own commercial boundaries. If your job is to enrich records, score accounts, map companies, track hiring signals, or build outbound infrastructure, the better modern alternative is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>.</p>
<p>I want to be very explicit here because this was the admin feedback, and it was correct: <strong>NinjaPear is not a LinkedIn API. It does not scrape LinkedIn. It does not rely on LinkedIn data.</strong> It builds company and people intelligence from public sources and returns that data in a structured shape that is useful for many of the same downstream workflows people previously reached for Proxycurl or LinkedIn APIs to solve.</p>
<p>That means the overlap is in the <strong>job to be done</strong>, not the source.</p>
<p>If your workflow says, "I need a company profile, headcount, funding, updates, work email, or a professional profile-like record for enrichment," NinjaPear can often fill that need. If your workflow says, "I specifically need official LinkedIn member data under LinkedIn's permissions model," then only LinkedIn can give you that.</p>
<h3 id="where-the-old-proxycurl-endpoints-map-now">Where the old Proxycurl endpoints map now</h3>
<p>Here is the practical translation layer.</p>
<table>
<thead>
<tr>
<th>Historical need</th>
<th>Old Proxycurl approach</th>
<th>NinjaPear replacement, not LinkedIn-sourced</th>
<th>Pricing model</th>
<th>Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Person profile enrichment</td>
<td>Person Profile API</td>
<td><a href="https://nubela.co/docs/?ref=nubela.co">Employee API</a> <code>GET /api/v1/employee/profile</code></td>
<td>3 credits per call</td>
<td>4.5/5</td>
</tr>
<tr>
<td>Company profile enrichment</td>
<td>Company Profile API</td>
<td><a href="https://nubela.co/company-api?ref=nubela.co">Company API</a> <code>GET /api/v1/company/details</code></td>
<td>3 credits per call</td>
<td>4.5/5</td>
</tr>
<tr>
<td>Employee count</td>
<td>Company enrichment / employee endpoints</td>
<td>Company API <code>GET /api/v1/company/employee-count</code></td>
<td>part of Company API suite</td>
<td>4.5/5</td>
</tr>
<tr>
<td>Company monitoring</td>
<td>N/A or stitched tools</td>
<td>Company API <code>GET /api/v1/company/updates</code></td>
<td>2 credits per call</td>
<td>4.5/5</td>
</tr>
<tr>
<td>Funding data</td>
<td>separate vendor needed</td>
<td>Company API <code>GET /api/v1/company/funding</code></td>
<td>2 credits + 1 per unique investor</td>
<td>4.5/5</td>
</tr>
<tr>
<td>Work email lookup</td>
<td>Contact-style enrichment</td>
<td>Employee API <code>GET /api/v1/employee/work-email</code></td>
<td>2 credits on hit, 0.5 on miss</td>
<td>4.25/5</td>
</tr>
<tr>
<td>Company logo</td>
<td>separate logo endpoint</td>
<td><a href="https://nubela.co/logo?ref=nubela.co">Company Logo API</a> <code>GET /api/v1/company/logo</code></td>
<td>Free</td>
<td>5/5</td>
</tr>
</tbody>
</table>
<p>A few specifics matter here:</p>
<ul>
<li>NinjaPear offers a <strong>3-day free trial with 10 credits included</strong>.</li>
<li><code>GET /api/v1/employee/profile</code> costs <strong>3 credits per call</strong>.</li>
<li><code>GET /api/v1/company/details</code> costs <strong>3 credits per call</strong>, with optional flags taking it up to 6.</li>
<li><code>GET /api/v1/company/updates</code> costs <strong>2 credits per call</strong>.</li>
<li><code>GET /api/v1/company/funding</code> costs <strong>2 credits per call + 1 credit per unique investor</strong>.</li>
<li><code>GET /api/v1/employee/work-email</code> costs <strong>2 credits when found, 0.5 credits on miss</strong>.</li>
<li>The Company Logo API is <strong>free</strong>.</li>
</ul>
<p>That is a much more useful pricing model than "talk to sales and maybe talk to legal after that."</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/linkedin</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/TheSocratesMethod</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">LinkedIn's API is really only for approved partners and very limited use cases. If you're trying to build anything around broad profile or company enrichment, you're probably looking in the wrong place.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/linkedin/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="example-setups">Example setups</h2>
<p>The original article had setup snippets, which were useful, so I'm preserving that idea and updating the alternative path.</p>
<h3 id="official-linkedin-style-flow">Official LinkedIn style flow</h3>
<p>If you are approved and have the right OAuth flow, your setup will generally look like this:</p>
<pre><code class="language-python">import requests

access_token = &quot;your_access_token&quot;

response = requests.get(
    &quot;https://api.linkedin.com/v2/me&quot;,
    headers={&quot;Authorization&quot;: f&quot;Bearer {access_token}&quot;}
)

print(response.json())
</code></pre>
<p>This is fine for approved, authenticated, narrow flows.</p>
<h3 id="ninjapear-person-profile-alternative">NinjaPear person profile alternative</h3>
<p>If what you really needed was structured professional profile data for enrichment, the NinjaPear path is much more direct. Again, this is <strong>not LinkedIn data</strong>. It is B2B profile data assembled from public sources.</p>
<pre><code class="language-python">import requests

response = requests.get(
    &quot;https://nubela.co/api/v1/employee/profile&quot;,
    params={&quot;email&quot;: &quot;patrick@stripe.com&quot;},
    headers={&quot;Authorization&quot;: &quot;Bearer YOUR_API_KEY&quot;}
)

print(response.json())
</code></pre>
<h3 id="ninjapear-company-profile-alternative">NinjaPear company profile alternative</h3>
<p>This is also not a LinkedIn company endpoint. It is company intelligence from public web sources in an API shape that is useful for enrichment.</p>
<pre><code class="language-python">import requests

response = requests.get(
    &quot;https://nubela.co/api/v1/company/details&quot;,
    params={&quot;website&quot;: &quot;https://stripe.com&quot;},
    headers={&quot;Authorization&quot;: &quot;Bearer YOUR_API_KEY&quot;}
)

print(response.json())
</code></pre>
<h3 id="ninjapear-company-updates-alternative">NinjaPear company updates alternative</h3>
<pre><code class="language-python">import requests

response = requests.get(
    &quot;https://nubela.co/api/v1/company/updates&quot;,
    params={&quot;website&quot;: &quot;https://stripe.com&quot;},
    headers={&quot;Authorization&quot;: &quot;Bearer YOUR_API_KEY&quot;}
)

print(response.json())
</code></pre>
<p>That last one matters more than most people realize. A lot of teams think they need LinkedIn profile or company data, but what they actually need is a trigger: hiring spike, website change, new funding, new blog post, social activity. That is a different class of intelligence.</p>
<h2 id="linkedin-api-pricing-what-you-should-actually-do">LinkedIn API pricing, what you should actually do</h2>
<p>If you are a big company building squarely inside LinkedIn's approved ecosystem, apply for the official program. That is the right move.</p>
<p>If you are a startup, recruiter, revops team, enrichment vendor, or GTM builder who needs structured people and company data without waiting around for a partner manager to bless your use case, the official LinkedIn path is usually the wrong first move.</p>
<p>This is the part people often avoid saying out loud. I'll say it plainly.</p>
<p>LinkedIn is optimizing for platform control. You are optimizing for shipping.</p>
<p>Those are not the same objective.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">linkedin: easy $10/mo upsell on me if you let me filter connection requests by role + fund size + relevance.

right now vc's at huge funds get buried under 600+ connection requests and i miss them. no mcp. no api. nothing.

@LinkedIn fix this</p>&mdash; Julius Brussee (@julius_brussee) <a href="https://x.com/julius_brussee/status/2058467210272604380?ref=nubela.co">Sun May 24 08:36:42 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="final-take">Final take</h2>
<p>The official LinkedIn API is real, but for most people searching for LinkedIn API pricing, it is the wrong abstraction. The issue is not whether an endpoint exists. The issue is whether you can get approved, afford the commercial model, and use the data the way your product actually needs.</p>
<p>That was the opening thesis of this article before. It still holds.</p>
<p>What changed is the alternative. Proxycurl is no more. NinjaPear is the continuation of that line of thinking, except with richer company intelligence, transparent credit-based pricing, and no dependence on LinkedIn or scraping LinkedIn.</p>
<p>If your next step is practical, do this: first decide whether you truly need official LinkedIn partner access or whether you just need structured B2B intelligence that looks similar to the output your workflow expects. If it's the second one, start with NinjaPear's free trial, test the Employee API and Company API on a few real accounts, and see if it covers the actual job you need done.</p>
<p>Just don't confuse the categories. LinkedIn APIs are LinkedIn products. NinjaPear is not. It is a separate B2B data platform that can solve many of the same business problems without pretending to be a LinkedIn API.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ We Scraped Ahrefs Evolve 2024 Attendees &amp; Enriched It with Professional Social Network Data to Identify Noteworthy People to Network With (Spreadsheet Included) ]]></title>
        <description><![CDATA[ My marketing team and I are attending the Ahrefs Evolve 2024 conference in 2 days time. My objective (as the CEO of the company) in attending this conference is really to identify a few brilliant individuals whom I might be able to hire to join Proxycurl to bolster our marketing ]]></description>
        <link>https://nubela.co/blog/we-scraped-ahrefs-evolve-2024-attendees-enriched-it-with-linkedin-data-to-identify-noteworthy-people-to-network-with-spreadsheet-included/</link>
        <guid isPermaLink="false">671766061cb59d0001b171ab</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 22 Oct 2024 16:49:20 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>My marketing team and I are attending the <a href="https://ahrefs.com/events/evolve2024-singapore?ref=nubela.co">Ahrefs Evolve 2024 conference</a> in 2 days time. My objective (as the CEO of the company) in attending this conference is really to identify a few brilliant individuals whom I might be able to hire to join Proxycurl to bolster our marketing team. Just yesterday, I was logging into Micepad, the official platform for the conference, to check out the event agenda and schedule; and I found that the full list of attendees is located within the dashboard for my browsing.</p>
<p>As a product CEO and a software developer, I noticed that the attendees were lazily loaded as you scrolled to the end of the page. Also, I noticed that the full list of attendees can be fetched. The problem is that I lack finer details of attendees. What kind of companies do they work for? How noteworthy are they? Instantly, I realized that Proxycurl with our <a href="https://nubela.co/proxycurl/people-api?ref=nubela.co">Person Lookup Endpoint</a> is the solution I am seeking. I already have the first/last name and the company they are working with; therefore I can pair each attendee with the Professional Social Network profile URL, and then enrich it further with their profile data such as follower count, etc.</p>
<p>But before I jump into it, <a href="https://docs.google.com/spreadsheets/d/18OVMmdH4wTQufG3dSwHsw6qRf-RsANKh0AfSE5oetns/edit?usp=sharing&ref=nubela.co">here's the attendee list for Ahrefs Evolve 2024</a>.</p>

<!--kg-card-begin: html-->
<iframe style="width:100%;min-height:500px;" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQ2roG6YXN8VMECNtoUVSM0Wf4QUjDJCVOi_kw0jbT3mfqhcVMPh8f7-qF7JGnRJuJ5JEDSKrhxdPB1/pubhtml?gid=1679812332&amp;single=true&amp;widget=true&amp;headers=false"></iframe>
<!--kg-card-end: html-->
<h2 id="scraping-and-paginating-attendees">Scraping and paginating attendees</h2>
<p>I opened up my handy developer tools in Firefox, and scrolled to the end of the page of Micepad Attendee page; checked out the XHR requests that was happening and I saw this request simulated by this <code>curl</code> command:</p>
<pre><code class="language-sh">curl 'https://app.micepad.co/api/web2/getInstanceAttendees' \
  --compressed \
  -X POST \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:132.0) Gecko/20100101 Firefox/132.0' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Accept-Language: en-US,en;q=0.5' \
  -H 'Accept-Encoding: gzip, deflate, br, zstd' \
  -H 'Referer: https://micepad.co/' \
  -H 'Content-Type: application/json' \
  -H 'Origin: https://micepad.co' \
  -H 'DNT: 1' \
  -H 'Connection: keep-alive' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'Pragma: no-cache' \
  -H 'Cache-Control: no-cache' \
  -H 'TE: trailers' \
  --data-raw '{
    "expressions":[],
    "moduleid":221220,
    "searchTerm":"",
    "offset":4,
    "apikey":"xxx-censored-xxx",
    "instanceid":6751,
    "languageid":7277
  }'
</code></pre>
<p>Lo and behold, the attendees were returned in JSON like this:</p>
<pre><code class="language-json">[
  {
    "email": "",
    "firstname": "Aaron",
    "lastname": "Taylor",
    "title": "SEO Director",
    "company": "Prosperity Media",
    "country": "AU",
    "phonenumber": "",
    "industry": "",
    "photoPath": "",
    "biography": "",
    "businessCardPath": "",
    "isValid": true,
    "fullName": "Aaron Taylor",
    "userid": 1027150,
    "instanceid": 6751,
    "instanceUser": {
      "userid": 1027150,
      "type": "user",
      "bmstatus": 1
    },
    "bmChoicesIds": [],
    "realScore": 0,
    "totalScore": 0,
    "rank": 13,
    "allowInitiateText": 1,
    "allowReceiveText": 1,
    "allowInitiateVideoCall": 0,
    "allowAnswerVideoCall": 0,
    "allowRequestMeeting": 1,
    "allowAcceptMeeting": 1,
    "onlineStatus": 0
  },
  {
    "email": "",
    "firstname": "Aaron",
    "lastname": "Sin",
    "title": "Specialist, Marketing Communications &amp; Investor Relations",
    "company": "Tiong Woon Crane &amp; Transport Pte Ltd",
    "country": "SG",
    "phonenumber": "",
    "industry": "",
    "photoPath": "https://data.micepad.co/data/uploads/6751/profile/SXdxlp_AaronSinNoBackground_6de0bb99-a619-48f2-bbc2-84b148283712_resized512.png",
    "biography": "",
    "businessCardPath": "",
    "isValid": true,
    "fullName": "Aaron Sin",
    "userid": 1044715,
    "instanceid": 6751,
    "instanceUser": {
      "userid": 1044715,
      "type": "user",
      "bmstatus": 1
    },
    "bmChoicesIds": [],
    "realScore": 0,
    "totalScore": 0,
    "rank": 18,
    "allowInitiateText": 1,
    "allowReceiveText": 1,
    "allowInitiateVideoCall": 0,
    "allowAnswerVideoCall": 0,
    "allowRequestMeeting": 1,
    "allowAcceptMeeting": 1,
    "onlineStatus": 0
  },
  ...
]
</code></pre>
<p>With common sense while analyzing the request, you can see that I can basically paginate the entire attendee list by incrementing the <code>offset</code> value from <code>0</code> to <code>N</code>.</p>
<p>Here's the parameter set in question:</p>
<pre><code class="language-json">{
    "expressions":[],
    "moduleid":221220,
    "searchTerm":"",
    "offset":4, // &lt;--- increment this number starting from 0
    "apikey":"xxx-censored-xxx",
    "instanceid":6751,
    "languageid":7277
  }
</code></pre>
<p>So, with some trusty Python for which I barely touch these days, I wrote this up to paginate through Micepad to get the full list of attendees:</p>
<pre><code class="language-python">def scrape_attendees():
    url = 'https://app.micepad.co/api/web2/getInstanceAttendees'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:132.0) Gecko/20100101 Firefox/132.0',
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'en-US,en;q=0.5',
        'Content-Type': 'application/json',
        'Origin': 'https://micepad.co',
        'DNT': '1',
        'Connection': 'keep-alive',
        'Referer': 'https://micepad.co/',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
    }

    payload = {
        "expressions": [],
        "moduleid": 221220,
        "searchTerm": "",
        "offset": 0,
        "apikey": "xxx-censored-xxx",
        "instanceid": 6751,
        "languageid": 7277
    }

    all_attendees = []
    total_records = None

    while True:
        response = requests.post(url, headers=headers, json=payload)
        data = response.json()

        if total_records is None:
            total_records = data['totalRecords']
            print(f"Total records: {total_records}")

        attendees = data['attendees']
        all_attendees.extend(attendees)
        print(f"Fetched {len(all_attendees)} attendees so far...")

        if len(attendees) == 0 or len(all_attendees) &gt;= total_records:
            print(f"Fetched {len(all_attendees)} attendees in total")
            break

        payload['offset'] += 1

    print(f"Total attendees fetched: {len(all_attendees)}")

    with open('attendees.json', 'w') as f:
        json.dump(all_attendees, f, indent=2)
</code></pre>
<p>Now I have a list of attendees. But that isn't enough. I want to <strong>enrich each of these attendees with their Professional Social Network profile URL</strong> and sort these attendees by their follower count.</p>
<h2 id="enriching-attendees-with-professional-social-network-profile-url-and-profile-data">Enriching attendees with Professional Social Network Profile URL and profile data</h2>
<p>It turns out that Proxycurl has the perfect tool for this. With a person's first and last name, and the company they are working with, there is a very good chance we'll be able to match this person to his/her Professional Social Network Profile URL via the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-lookup-endpoint">Person Lookup Endpoint</a>. On top of that, it can enrich the matched Professional Social Network Profile URL with the full dataset, <strong>all within one API request</strong>.</p>
<p>So given that there are <code>522</code> attendees and I don't have all day. So I decided to sprint through the attendee list by making API calls to the Person Lookup Endpoint concurrently. I did this with a worker pool of <code>10</code> (coincidentally, while doing so, I found a bug within our API endpoint for which we were returning the wrong status code when we failed to match it with any result. This is now being fixed, hah).</p>
<p>Here's how I did it:</p>
<pre><code class="language-python">def enrich_attendee(attendee):
    api_key = PROXYCURL_API_KEY

    url = 'https://nubela.co/proxycurl/api/Professional Social Network/profile/resolve'
    headers = {
        'Authorization': f'Bearer {api_key}'
    }
    params = {
        'company_domain': attendee.get('company', ''),
        'first_name': attendee.get('firstname', ''),
        'last_name': attendee.get('lastname', ''),
        'enrich_profile': 'enrich',
        'location': f"{attendee.get('city', '')} {attendee.get('country', '')}".strip(),
        'title': attendee.get('title', '')
    }

    retries = 0
    max_retries = 2
    while retries &lt; max_retries:
        response = requests.get(url, headers=headers, params=params)
        if response.status_code == 200:
            enriched_data = response.json()
            attendee['enriched_data'] = enriched_data
            break
        elif response.status_code == 503:
            retries += 1
            if retries &lt; max_retries:
                print(f"Received 503 error. Retrying ({retries}/{max_retries})...")
                time.sleep(2 ** retries)  # Exponential backoff
            else:
                print(f"Failed to enrich attendee after {max_retries} retries: {attendee['fullName']} - Status code: {response.status_code}")
                print(f"Params for failed request: {params}")
        else:
            print(f"Failed to enrich attendee: {attendee['fullName']} - Status code: {response.status_code}")
            break

    return attendee

def enrich_attendees():
    with open('attendees.json', 'r') as f:
        attendees = json.load(f)

    # Load existing enriched attendees
    try:
        with open('attendees_enriched.json', 'r') as f:
            enriched_attendees = json.load(f)
    except Exception:
        enriched_attendees = []

    # Create a set of already enriched attendee IDs for quick lookup
    enriched_ids = set(attendee['userid'] for attendee in enriched_attendees)

    # Create a lock for thread-safe writing
    write_lock = threading.Lock()

    def enrich_and_save(attendee):
        if attendee['userid'] not in enriched_ids:
            enriched_attendee = enrich_attendee(attendee)
            with write_lock:
                with open('attendees_enriched.json', 'a') as f:
                    json.dump(enriched_attendee, f)
                    f.write('\n')
            print(f"Enriched and saved attendee: {enriched_attendee['fullName']}")
            return enriched_attendee
        else:
            print(f"Skipped already enriched attendee: {attendee['fullName']}")
            return None

    executor = ThreadPoolExecutor(max_workers=10)
    futures = []

    try:
        for attendee in attendees:
            futures.append(executor.submit(enrich_and_save, attendee))

        for future in as_completed(futures):
            enriched_attendee = future.result()
            if enriched_attendee:
                enriched_attendees.append(enriched_attendee)

    except KeyboardInterrupt:
        print("\nScript interrupted by user. Aborting remaining tasks and saving progress...")
        executor.shutdown(wait=False, cancel_futures=True)
    finally:
        executor.shutdown(wait=True)
        print(f"Enriched {len(enriched_attendees)} attendees. Results saved to attendees_enriched.json")
</code></pre>
<p>Quite easily done. This was completed in a few minutes.</p>
<h2 id="exporting-to-csv">Exporting to CSV</h2>
<p>JSON is not my favourite way to work with files. I much prefer my spreadsheet UI. And my spreadsheet of choice is Google Sheets. So, I decided to export the dataset to CSV for which I can easily open with Google Sheets.</p>
<p>The last step for me was to export the data to CSV file, for which I uploaded to Google Sheets, which you can view <a href="https://docs.google.com/spreadsheets/d/18OVMmdH4wTQufG3dSwHsw6qRf-RsANKh0AfSE5oetns/edit?usp=sharing&ref=nubela.co">here</a>.</p>
<p>This was how I did it:</p>
<pre><code class="language-python">def export_to_csv():
    try:
        with open('attendees_refreshed.json', 'r') as f:
            attendees = [json.loads(line) for line in f]
    except FileNotFoundError:
        print("Error: attendees_refreshed.json not found. Please run the 'refresh' command first.")
        return

    csv_filename = 'attendees_enriched.csv'

    with open(csv_filename, 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = ['First Name', 'Last Name', 'Latest Job Title', 'Current Company',
                      'Professional Social Network Profile URL', 'Current Company Professional Social Network Profile URL',
                      'Follower Count', 'Bio', 'Headline', 'Country']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for attendee in attendees:
            enriched_data = attendee.get('enriched_data', {})
            profile_data = enriched_data.get('profile', {})
            experiences = profile_data.get('experiences', [])
            current_job = experiences[0] if experiences else {}

            writer.writerow({
                'First Name': attendee.get('firstname', ''),
                'Last Name': attendee.get('lastname', ''),
                'Latest Job Title': attendee.get('title', ''),
                'Current Company': attendee.get('company', ''),
                'Professional Social Network Profile URL': enriched_data.get('url', ''),
                'Current Company Professional Social Network Profile URL': current_job.get('company_Professional Social Network_profile_url', ''),
                'Follower Count': profile_data.get('follower_count', ''),
                'Bio': profile_data.get('summary', ''),
                'Headline': profile_data.get('headline', ''),
                'Country': profile_data.get('country_full_name', '')
            })

    print(f"Exported {len(attendees)} attendees to {csv_filename}")
</code></pre>
<h2 id="i-lied-i-did-more">I lied, I did more</h2>
<p>Yeah, it turns out that the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-lookup-endpoint">Person Lookup Endpoint</a> returns data that has varying levels of freshness. I wanted <strong>fresh profile data</strong>. So I needed to make another pass on the attendee data via the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">Person Profile Endpoint</a> with the <code>use_cache=if-recent</code> parameter to <a href="https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/">fetch fresh profile data</a>.</p>
<p>Of course, this is completely optional and I really did this because it was cool. This was trivial given that I already have the Professional Social Network Profile URL. Given that this is optional, I will leave this as an exercise to the reader.</p>
<h2 id="enrichment-is-really-useful">Enrichment is really useful</h2>
<p>I whipped this up in 2-3H and I barely write code. And within a day, I have <strong>a list of 522 attendees</strong> to the Ahrefs Evolve 2024 conference I'm attending with <strong>detailed profile data</strong>.</p>
<p>If I can do this for an attendee list, just imagine what you can do for your business or your CRM.</p>
<p>Anyways have fun! If you're attending the event, hit up the marketing team at Proxycurl via <a href="mailto:marketing@nubela.co">marketing@nubela.co</a>, and we'll be happy to have a chat with you!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Guide to LinkedIn Company API in 2026, With Full Python Code Samples ]]></title>
        <description><![CDATA[ In simple terms, the official Professional Social Network Company API is a set of programmatic interfaces that allow developers to access and retrieve data about companies listed on Professional Social Network. It&#39;s like having a direct line to Professional Social Network&#39;s vast database of corporat ]]></description>
        <link>https://nubela.co/blog/ultimate-guide-to-linkedin-company-api/</link>
        <guid isPermaLink="false">67109545b52061000188ad75</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Fri, 18 Oct 2024 11:31:26 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_412.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you're trying to figure out how to use the <strong>LinkedIn Company API</strong> in 2026, here’s the blunt answer up front: the official route is still possible, but it is gated, limited, and usually a poor fit unless you are already inside LinkedIn’s partner ecosystem. If you just need company data in code, there are faster ways to get productive.</p>
<p>I’ve spent enough years around company data to know that the hard part is rarely the HTTP request. The hard part is access, reliability, freshness, and whether the thing still works once legal, product, and pricing realities show up.</p>
<p>This guide is for developers who want the real answer. Not the doc-page answer.</p>
<p>We’ll cover:</p>
<ul>
<li>how the official LinkedIn Company API works</li>
<li>what you can realistically get access to</li>
<li>full Python code samples for the official route</li>
<li>where the official route breaks down</li>
<li>what to use instead if your actual goal is company intelligence in production</li>
</ul>
<p>Let’s start with the official path.</p>
<h2 id="why-trust-this-guide">Why trust this guide?</h2>
<p>I’ve built and sold products in this category. I’ve paid for APIs that looked clean in the docs and turned into a support problem a month later. I’ve also built around those problems.</p>
<p>That matters here because most articles about the LinkedIn Company API stop at "here is the endpoint" and skip the part that actually burns engineering time.</p>
<p>My bias is simple: I care about what ships.</p>
<h2 id="two-linkedin-api-paths">Two LinkedIn API paths</h2>
<p>There are really two buckets here:</p>
<ol>
<li><strong>The official LinkedIn Company API</strong></li>
<li><strong>Third-party company data APIs</strong></li>
</ol>
<p>If you specifically need LinkedIn-native workflows, partner access, or product-approved use inside LinkedIn’s ecosystem, the first bucket matters.</p>
<p>If you just want company data in code, the second bucket usually matters more.</p>
<h2 id="the-official-linkedin-company-api">The official LinkedIn Company API</h2>
<p>The official <strong>LinkedIn Company API</strong> is not fake. It exists. It can be useful. But it is not an open, self-serve developer product in the way Stripe or Twilio trained people to expect.</p>
<p>That distinction matters.</p>
<h3 id="what-the-linkedin-company-api-gives-you">What the LinkedIn Company API gives you</h3>
<p>At a high level, the official LinkedIn Company API can expose:</p>
<ol>
<li><strong>Company profile data</strong></li>
<li>company name</li>
<li>website</li>
<li>industry</li>
<li>company size</li>
<li>locations</li>
<li>
<p>founded year</p>
</li>
<li>
<p><strong>Follower and page metrics</strong></p>
</li>
<li>follower count</li>
<li>
<p>selected audience or page analytics, depending on scope</p>
</li>
<li>
<p><strong>Posts and updates</strong></p>
</li>
<li>company posts</li>
<li>
<p>engagement metrics in some partner contexts</p>
</li>
<li>
<p><strong>Jobs and related org data</strong></p>
</li>
<li>current openings or related organization data, depending on product access</li>
</ol>
<p>That all sounds reasonable. The issue is that the phrase "can expose" is doing a lot of work.</p>
<h3 id="who-the-linkedin-company-api-is-for">Who the LinkedIn Company API is for</h3>
<p>Here’s the practical use-case map.</p>
<table>
<thead>
<tr>
<th>User Group</th>
<th>Use Cases</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Developers</strong></td>
<td>internal research tools, CRM enrichment, company search features</td>
</tr>
<tr>
<td><strong>Data teams</strong></td>
<td>firmographic analysis, account scoring, segmentation</td>
</tr>
<tr>
<td><strong>Recruiting teams</strong></td>
<td>employer research, hiring-spike detection, company tracking</td>
</tr>
<tr>
<td><strong>Sales teams</strong></td>
<td>account research, territory planning, target account enrichment</td>
</tr>
<tr>
<td><strong>Consultants</strong></td>
<td>market maps, partner research, category analysis</td>
</tr>
<tr>
<td><strong>Founders</strong></td>
<td>competitor tracking, early market validation, account intelligence</td>
</tr>
</tbody>
</table>
<p>The mistake I see is people assuming the official API is automatically the best option for all of those. It isn’t.</p>
<h2 id="access-is-the-real-product">Access is the real product</h2>
<p>This is the part most LinkedIn Company API articles soften up. I won’t.</p>
<p>The API itself is not the main obstacle. Access is.</p>
<h3 id="four-things-to-know-first">Four things to know first</h3>
<ol>
<li><strong>It is gated</strong></li>
<li>
<p>You are often applying for product access, not just generating keys.</p>
</li>
<li>
<p><strong>Approval can be slow</strong></p>
</li>
<li>
<p>Expect forms, review, use-case scrutiny, and back-and-forth.</p>
</li>
<li>
<p><strong>Competitive products have a harder time</strong></p>
</li>
<li>
<p>If your product starts looking too much like something LinkedIn already sells, that is not helpful.</p>
</li>
<li>
<p><strong>Pricing and packaging are not especially transparent</strong></p>
</li>
<li>This is not a clean public pricing page kind of experience.</li>
</ol>
<p>That does not mean "don’t use it." It means go in sober.</p>
<h2 id="step-1-apply-as-a-linkedin-partner">Step 1: Apply as a LinkedIn Partner</h2>
<p>If you want the official LinkedIn Company API, this is usually where the journey starts.</p>
<h3 id="pick-your-lane">Pick your lane</h3>
<p>LinkedIn’s partner ecosystem generally maps to categories like:</p>
<ul>
<li><strong>Talent Solutions</strong></li>
<li><strong>Marketing Solutions</strong></li>
<li><strong>Sales Navigator Application Development</strong></li>
<li><strong>LinkedIn Learning Integration</strong></li>
</ul>
<p>Pick the one that actually fits what you do. Do not try to be clever here.</p>
<h3 id="prepare-the-application-properly">Prepare the application properly</h3>
<p>You want to be concrete about:</p>
<ul>
<li>what product you are building</li>
<li>how you use LinkedIn data</li>
<li>why your use case belongs in LinkedIn’s ecosystem</li>
<li>how your product complements rather than collides with LinkedIn</li>
</ul>
<p>Vague applications die in review.</p>
<h3 id="submit-it">Submit it</h3>
<p>The current place to start is LinkedIn’s product catalog:</p>
<p><a href="https://developer.linkedin.com/product-catalog?ref=nubela.co">https://developer.linkedin.com/product-catalog</a></p>
<p>Then wait.</p>
<p>That is not me being dramatic. That is just the process.</p>
<h2 id="step-2-set-up-a-linkedin-developer-app">Step 2: Set up a LinkedIn developer app</h2>
<p>While you are waiting, you can at least get your app plumbing done.</p>
<h3 id="basic-setup-flow">Basic setup flow</h3>
<ol>
<li>Go to <a href="https://developer.linkedin.com/?ref=nubela.co">https://developer.linkedin.com/</a></li>
<li>Create or sign into your developer account</li>
<li>Create an app</li>
<li>Associate and verify the app with your company</li>
<li>Request the relevant product access</li>
<li>Retrieve your <strong>Client ID</strong> and <strong>Client Secret</strong> if approved</li>
</ol>
<p>Be specific in the app description. LinkedIn tends to reward specificity.</p>
<h2 id="step-3-use-the-linkedin-company-api-with-python">Step 3: Use the LinkedIn Company API with Python</h2>
<p>Now for the part you came for.</p>
<p>I’ll show the official approach first.</p>
<h3 id="the-moving-parts">The moving parts</h3>
<p>You will typically deal with:</p>
<ol>
<li><a href="https://learn.microsoft.com/en-us/linkedin/marketing/community-management/organizations/company-search?ref=nubela.co">Company Search API</a></li>
<li><a href="https://oauth.net/2/?ref=nubela.co">OAuth 2.0</a></li>
<li><a href="https://learn.microsoft.com/en-us/linkedin/shared/authentication/getting-access?ref=nubela.co">LinkedIn access scopes and permissions</a></li>
</ol>
<h3 id="get-an-access-token">Get an access token</h3>
<pre><code class="language-python">import requests

LINKEDIN_CLIENT_ID = 'your_client_id'
LINKEDIN_CLIENT_SECRET = 'your_client_secret'


def get_access_token():
    &quot;&quot;&quot;
    Exchange LinkedIn app credentials for an access token.
    &quot;&quot;&quot;
    token_url = 'https://www.linkedin.com/oauth/v2/accessToken'

    payload = {
        'grant_type': 'client_credentials',
        'client_id': LINKEDIN_CLIENT_ID,
        'client_secret': LINKEDIN_CLIENT_SECRET,
    }

    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    response = requests.post(token_url, headers=headers, data=payload, timeout=30)

    if response.status_code == 200:
        return response.json().get('access_token')

    print(f&quot;Token error {response.status_code}: {response.text}&quot;)
    return None
</code></pre>
<p>Store the token securely and reuse it until it expires. Nothing fancy required.</p>
<h3 id="search-for-companies">Search for companies</h3>
<pre><code class="language-python">import requests
from urllib.parse import urlencode


def search_companies(access_token, search_query='LinkedIn Corporation', filters=None):
    &quot;&quot;&quot;
    Search for companies on LinkedIn.
    &quot;&quot;&quot;
    base_url = 'https://api.linkedin.com/v2/companySearch'
    params = {
        'q': 'search',
        'query': search_query,
        'projection': '(elements*(entity~(id,name,localizedName,vanityName,logoV2,locations)),paging)'
    }

    if filters:
        for key, value in filters.items():
            if isinstance(value, list):
                for i, v in enumerate(value):
                    params[f'filter.{key}[{i}]'] = v
            else:
                params[f'filter.{key}'] = value

    headers = {
        'Authorization': f'Bearer {access_token}',
        'X-Restli-Protocol-Version': '2.0.0'
    }

    url = f&quot;{base_url}?{urlencode(params)}&quot;
    response = requests.get(url, headers=headers, timeout=30)

    if response.status_code == 200:
        return response.json()

    print(f&quot;Search error {response.status_code}: {response.text}&quot;)
    return None
</code></pre>
<h3 id="full-runnable-python-example">Full runnable Python example</h3>
<pre><code class="language-python">import requests
from urllib.parse import urlencode

LINKEDIN_CLIENT_ID = 'your_client_id'
LINKEDIN_CLIENT_SECRET = 'your_client_secret'


def get_access_token():
    token_url = 'https://www.linkedin.com/oauth/v2/accessToken'
    payload = {
        'grant_type': 'client_credentials',
        'client_id': LINKEDIN_CLIENT_ID,
        'client_secret': LINKEDIN_CLIENT_SECRET,
    }
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    response = requests.post(token_url, headers=headers, data=payload, timeout=30)

    if response.status_code == 200:
        return response.json().get('access_token')

    print(f&quot;Token error {response.status_code}: {response.text}&quot;)
    return None


def search_companies(access_token, search_query='Stripe', filters=None):
    base_url = 'https://api.linkedin.com/v2/companySearch'
    params = {
        'q': 'search',
        'query': search_query,
        'projection': '(elements*(entity~(id,name,localizedName,vanityName,logoV2,locations)),paging)'
    }

    if filters:
        for key, value in filters.items():
            if isinstance(value, list):
                for i, v in enumerate(value):
                    params[f'filter.{key}[{i}]'] = v
            else:
                params[f'filter.{key}'] = value

    headers = {
        'Authorization': f'Bearer {access_token}',
        'X-Restli-Protocol-Version': '2.0.0'
    }

    url = f&quot;{base_url}?{urlencode(params)}&quot;
    response = requests.get(url, headers=headers, timeout=30)

    if response.status_code == 200:
        return response.json()

    print(f&quot;Search error {response.status_code}: {response.text}&quot;)
    return None


if __name__ == '__main__':
    token = get_access_token()
    if token:
        result = search_companies(token, search_query='Stripe')
        print(result)
</code></pre>
<p>A few practical notes:</p>
<ul>
<li>input is generally case-insensitive</li>
<li>Boolean behavior is not what many users expect</li>
<li>one-company-at-a-time workflows are more reliable than trying to get fancy</li>
<li>respect rate limits or you’ll waste time debugging your own traffic patterns</li>
</ul>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/recruiting</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/evsk21</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Our LinkedIn rep told us they try to pull in as many profiles as possible. I would rather them only listen to our booleans even if it only pulls up 5 people, that’s then our problem to rework the Boolean to be more realistic. As someone who searches for exec/niche roles I usually need the key words I put in and nothing alternative. I wish there was like an on off switch like “expand my search” as needed.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/recruiting/comments/1mrjfta/is_linkedin_recruiter_not_recognizing_boolean/n9ak1fm/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="where-the-linkedin-company-api-breaks">Where the LinkedIn Company API breaks</h2>
<p>This is where the official LinkedIn Company API starts to feel less like a developer tool and more like a negotiated relationship.</p>
<h3 id="1-rate-limits">1. Rate limits</h3>
<p>Even generous-looking limits stop feeling generous when you need to:</p>
<ul>
<li>refresh thousands of accounts</li>
<li>run nightly enrichment jobs</li>
<li>support customer-triggered lookups</li>
<li>reprocess stale records</li>
</ul>
<p>A demo workload is not a production workload. I’ve learned that one the expensive way.</p>
<h3 id="2-limited-company-context">2. Limited company context</h3>
<p>For many real use cases, LinkedIn company data is too narrow on its own.</p>
<p>You may need:</p>
<ul>
<li>funding history</li>
<li>executive data</li>
<li>better address coverage</li>
<li>broader company-web signals</li>
<li>unified account identifiers outside LinkedIn URLs</li>
</ul>
<p>That is usually where teams start bolting on more sources.</p>
<h3 id="3-dependency-risk">3. Dependency risk</h3>
<p>This is the strategic issue.</p>
<p>If your product depends on access you do not truly control, then your roadmap is partially rented. That is fine if the business case supports it. It is not fine if you are pretending otherwise.</p>
<h2 id="proxycurl-then-ninjapear">Proxycurl, then NinjaPear</h2>
<p>This is the right place for the update.</p>
<p>Historically, Proxycurl existed because a lot of developers wanted LinkedIn-style company and people data without the official LinkedIn Company API friction. That was the whole appeal: faster onboarding, simpler auth, and practical data access.</p>
<p>That part was real.</p>
<p>The 2026 update is that <strong>Proxycurl has been sunset</strong>. I’m the founder behind Proxycurl, and the work has since moved to NinjaPear.</p>
<p>I’m keeping the Proxycurl context in this guide because the implementation lessons still hold, and a lot of developers still search for Proxycurl by name. But if you are reading this in 2026 and asking what to use now, the answer is not Proxycurl. It is NinjaPear.</p>
<h2 id="a-better-2026-alternative">A better 2026 alternative</h2>
<p>If what you actually need is company data in code, I would look at <a href="https://nubela.co/company-api?ref=nubela.co">Company API</a> first.</p>
<p>More specifically, I’d start with the <strong>Company Details Endpoint</strong>.</p>
<p>Why? Because it takes a <strong>company website</strong> as the primary input, which is a much better key for most modern workflows than a LinkedIn company URL.</p>
<p>That sounds small. It is not small.</p>
<p>Your CRM has websites. Your warehouse has domains. Your outbound list probably has domains. Your product likely does not want to anchor itself to LinkedIn URLs if it can avoid it.</p>
<h3 id="what-ninjapear-company-api-returns">What NinjaPear Company API returns</h3>
<p>With the Company Details Endpoint, you can retrieve data such as:</p>
<ul>
<li>company name</li>
<li>company type</li>
<li>founded year</li>
<li>industry</li>
<li>employee count</li>
<li>executive data</li>
<li>office addresses</li>
<li>public social links</li>
<li>public listing details where available</li>
</ul>
<p>And beyond company details, the same API family includes:</p>
<ul>
<li>website lookup</li>
<li>employee count</li>
<li>company updates</li>
<li>funding data</li>
<li>free logo lookup</li>
</ul>
<p>That last part matters because most company enrichment jobs do not stop at "give me the company name and headcount."</p>
<p>They turn into:</p>
<ul>
<li>enrich the CRM</li>
<li>score accounts by size and funding</li>
<li>monitor target accounts</li>
<li>build competitor maps</li>
<li>feed a prospecting workflow</li>
</ul>
<h3 id="quick-python-example-with-ninjapear">Quick Python example with NinjaPear</h3>
<p>This is the cleanest version of the job most people actually want done.</p>
<pre><code class="language-python">import requests

NP_API_KEY = 'YOUR_API_KEY'


def fetch_company_details(website: str):
    api_endpoint = 'https://nubela.co/api/v1/company/details'
    headers = {
        'Authorization': f'Bearer {NP_API_KEY}'
    }
    params = {
        'website': website
    }

    response = requests.get(api_endpoint, headers=headers, params=params, timeout=30)

    if response.status_code == 200:
        return response.json()

    print(f&quot;Error {response.status_code}: {response.text}&quot;)
    return None


if __name__ == '__main__':
    company = fetch_company_details('https://stripe.com')
    if company:
        print('Name:', company.get('name'))
        print('Founded year:', company.get('founded_year'))
        print('Employee count:', company.get('employee_count'))
        print('Executives:', company.get('executives'))
        print('Addresses:', company.get('addresses'))
</code></pre>
<p>If you also want funding data:</p>
<pre><code class="language-python">import requests

NP_API_KEY = 'YOUR_API_KEY'


def fetch_company_funding(website: str):
    api_endpoint = 'https://nubela.co/api/v1/company/funding'
    headers = {
        'Authorization': f'Bearer {NP_API_KEY}'
    }
    params = {
        'website': website
    }

    response = requests.get(api_endpoint, headers=headers, params=params, timeout=30)

    if response.status_code == 200:
        return response.json()

    print(f&quot;Error {response.status_code}: {response.text}&quot;)
    return None


if __name__ == '__main__':
    funding = fetch_company_funding('https://stripe.com')
    if funding:
        print('Total funds raised USD:', funding.get('total_funds_raised_usd'))
        print('Funding rounds:', funding.get('funding_rounds'))
</code></pre>
<p>Short. Useful. No partner application.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Spent way too long getting LinkedIn data into my agent using scrapers. DOM changes at the worst times, captchas hit at random hours. Finally moved to an API endpoint. Haven't thought about it since. Using https://t.co/Rh1qtIzrZs - profile data and company lookups through a single HTTP call.</p>&mdash; Millo the first (@millo_2_assist) <a href="https://x.com/millo_2_assist/status/2056223801684173050?ref=nubela.co">Mon May 18 04:02:11 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="linkedin-company-api-vs-alternatives">LinkedIn Company API vs alternatives</h2>
<p>If you are comparing 3 or more options, don’t do it with marketing adjectives. Do it with tradeoffs.</p>
<table>
<thead>
<tr>
<th>API / Option</th>
<th>Data Quality</th>
<th>Pricing Clarity</th>
<th>Ease of Use</th>
<th>API Surface</th>
<th>Business Reliability</th>
<th>Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Official LinkedIn Company API</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.00/5</strong></td>
</tr>
<tr>
<td><strong>Legacy Proxycurl Company API</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td><strong>3.60/5</strong></td>
</tr>
<tr>
<td><strong>NinjaPear Company API</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td><strong>4.40/5</strong></td>
</tr>
</tbody>
</table>
<p>And here is the more practical comparison.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>LinkedIn API</th>
<th>Legacy Proxycurl</th>
<th>NinjaPear</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Primary input</strong></td>
<td>LinkedIn entity / approved API flows</td>
<td>LinkedIn URL</td>
<td>Company website</td>
</tr>
<tr>
<td><strong>Getting started</strong></td>
<td>Approval-heavy</td>
<td>Immediate, historically</td>
<td>Immediate</td>
</tr>
<tr>
<td><strong>Auth model</strong></td>
<td>OAuth + approval</td>
<td>API key</td>
<td>API key</td>
</tr>
<tr>
<td><strong>Funding data</strong></td>
<td>Limited / indirect</td>
<td>Partial in some workflows</td>
<td>Yes, dedicated endpoint</td>
</tr>
<tr>
<td><strong>Employee count</strong></td>
<td>Available with constraints</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<td><strong>Company updates</strong></td>
<td>Partial / product-dependent</td>
<td>Limited by product mix</td>
<td>Yes, dedicated endpoint</td>
</tr>
<tr>
<td><strong>Logo endpoint</strong></td>
<td>Not standalone-friendly</td>
<td>Historically available</td>
<td>Yes, free</td>
</tr>
<tr>
<td><strong>Non-LinkedIn dependency</strong></td>
<td>No</td>
<td>No</td>
<td><strong>Yes</strong></td>
</tr>
</tbody>
</table>
<p>That final row matters more than most people think.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/recruiting</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/drixhen2</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Pretty sure there are 3 dots next to the field and you can click on them and choose "must have" for it to work properly. It defaults to "can have" which Messrs up the boolean especially when using it for multiple fields. 

That said, it's far from perfect and there's lots of missing profiles these days</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/recruiting/comments/1mrjfta/is_linkedin_recruiter_not_recognizing_boolean/n8zc0dj/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="compliance-and-operating-model">Compliance and operating model</h2>
<p>I’m not going to turn this into a legal essay.</p>
<p>But I will say this plainly: I am much more interested now in products with a cleaner long-term operating model than I was a few years ago.</p>
<p>That is one reason the website-first model matters.</p>
<p>If your goal is company intelligence, building around public web company data is a cleaner foundation than forcing every workflow through LinkedIn-native identifiers.</p>
<h2 id="beyond-company-details">Beyond company details</h2>
<p>If your workflow goes past simple enrichment, NinjaPear already has adjacent tools that fit naturally here.</p>
<p>Relevant products include:</p>
<ul>
<li><a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a></li>
<li><a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a></li>
<li>Company Logo API</li>
<li>employee and company enrichment primitives on the same platform</li>
</ul>
<p>That is useful because production workflows tend to grow sideways.</p>
<p>You start with one endpoint.
Then you want monitoring.
Then scoring.
Then outreach data.
Then competitor tracking.</p>
<p>That is how these systems actually evolve.</p>
<h2 id="final-verdict">Final verdict</h2>
<p>If you need the <strong>official LinkedIn Company API</strong> because your product must work inside LinkedIn’s ecosystem, then yes, pursue partner access and build carefully around its limits.</p>
<p>If what you actually want is <strong>company intelligence in production</strong>, I would not start there.</p>
<p>I would start with a website-first model and test <a href="https://nubela.co/company-api?ref=nubela.co">Company API</a>, especially the Company Details Endpoint. It is a simpler input, it gives you broader company context, and it avoids a lot of the partner-program friction that makes the official LinkedIn Company API slow to operationalize.</p>
<p>That is the practical answer in 2026.</p>
<p>If you want the next step, run two or three of your own target accounts through both approaches and compare the payloads you get back. Do that before you commit quarters of engineering time. It will tell you very quickly whether you need the official LinkedIn Company API, or whether you just need usable company data and fewer headaches.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Automate Sales Prospecting &amp; Outreach with AI Agents ]]></title>
        <description><![CDATA[ A successfully set-up AI agents workflow involves quality data and clear, specific instructions. These are exactly what we&#39;re talking about here - getting quality B2B data based on your parameters, and building the workflow. ]]></description>
        <link>https://nubela.co/blog/automate-sales-prospecting-outreach-with-ai-agents/</link>
        <guid isPermaLink="false">66b29dbbdead420001d51e40</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Tue, 15 Oct 2024 11:24:07 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Ever since LLMs like ChatGPT have hit the scene, they've been all the rage and have fundamentally changed how many things are done—<a href="https://nubela.co/blog/how-cold-emailing-grew-my-b2b-startup-to-100k-mrr/">sales prospecting and outreach</a> included.</p>
<p>But the ultimate question is: how can you practically implement LLMs to improve your workflow, rather than just being something fun to play with?</p>
<p>You know, at what point does "AI" become something like we originally imagined it being—something that can complete entire tasks for you?</p>
<p>For many things, AI isn't quite there yet. But for sales prospecting and outreach, quite a few things can be automated, or at least heavily assisted by AI agents right now.</p>
<p>That's what this article will be all about.</p>
<p>First things first:</p>
<h2 id="what-is-an-ai-agent">What is an AI agent?</h2>
<p>Good question. It'll have a slightly different answer depending on who you ask.</p>
<p>For example, <a href="https://www.ibm.com/think/topics/ai-agents?ref=nubela.co">IBM</a> describes an AI agent as:</p>
<blockquote>
<p>a system or program that <strong>autonomously performs tasks for a user</strong> or another system by designing its workflow and utilizing available tools.</p>
</blockquote>
<p>On the other hand, <a href="https://aws.amazon.com/what-is/ai-agents/?ref=nubela.co">Amazon</a> defines an AI agent as:</p>
<blockquote>
<p>software that interacts with its environment, collects data, and uses it to <strong>perform self-determined tasks</strong> to meet goals set by humans.</p>
</blockquote>
<p>Then <a href="https://techcrunch.com/2024/07/13/what-exactly-is-an-ai-agent/?ref=nubela.co">TechCrunch</a> describes an AI agent as:</p>
<blockquote>
<p>AI-driven software that <strong>performs tasks traditionally done by humans</strong>, potentially crossing multiple systems and handling various jobs beyond just answering questions.</p>
</blockquote>
<p>Basically, at its core, an AI agent is a software program designed to perform tasks autonomously. These agents can process information, make decisions, and execute actions based on predefined rules and learning from data.</p>
<h2 id="how-can-ai-agents-benefit-sales-prospecting">How can AI agents benefit sales prospecting?</h2>
<p>For sales prospecting, an AI agent can accomplish three main things:</p>
<ul>
<li><strong>Lead identification and ranking:</strong> An AI agent can search for leads that fit your Ideal Customer Profile (ICP), identify and rank them, and prospect on your behalf.</li>
<li><strong>Automated outreach:</strong> The agent can automatically reach out to ideal prospects and <a href="https://nubela.co/blog/how-salesforge-integrates-rich-prospecting-data-with-chatgpt-to-automatically-personalize-emails/">write a series of outreach messages</a> tailored to their interests and needs.</li>
<li><strong>Inbox management:</strong> The AI agent can monitor your email inbox, automatically replying to interested leads and pushing them to book a call with you directly.</li>
</ul>
<p>For B2B sales, this means you can use AI agents to handle the majority of the sales workflow. All you need to do is show up for sales demos and close the deal.</p>
<h2 id="the-first-step-to-any-ai-agent-is-data">The first step to any AI agent is data</h2>
<p>To get an LLM to do anything useful, it needs an appropriate amount of data for the task at hand.</p>
<p>For example, if you're automating sales prospecting, the AI agent would need access to relevant prospecting data, such as <a href="https://nubela.co/proxycurl/contact-api?ref=nubela.co">email addresses</a>, <a href="https://nubela.co/proxycurl/company-api?ref=nubela.co">company information</a>, and so on.</p>
<p>Incorporating <a href="https://nordvpn.com/features/dark-web-monitor/?ref=nubela.co">dark web monitoring</a> can help ensure the security of this data by identifying and mitigating potential threats from the dark web, thereby protecting sensitive information from being compromised.</p>
<h2 id="how-to-programmatically-access-b2b-data">How to programmatically access B2B data</h2>
<p>Luckily since you're on the <a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> blog, you'll have programmatic access to just about all of the B2B data you could ever possibly need.</p>
<p>We have millions of data points on people, jobs, companies, and more, and we provide acccess to it all via a REST API.</p>
<p>In this case, two very useful endpoints would be our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-person-search-endpoint">Person Search Endpoint</a>, and our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-personal-email-lookup-endpoint">Personal Email Lookup Endpoint</a>.</p>
<h3 id="searching-for-prospects">Searching for prospects</h3>
<p>So, for example, to search for prospects via our Person Search Endpoint, you could do so via a simple cURL command:</p>
<pre><code class="language-bash">curl \
    -G \
    -H "Authorization: Bearer ${YOUR_API_KEY}" \
    'https://nubela.co/proxycurl/api/v2/search/person' \
    --data-urlencode 'country=US' \
    --data-urlencode 'current_role_title=founder' \
    --data-urlencode 'industries=Computer Software' \
    --data-urlencode 'page_size=10' \
    --data-urlencode 'enrich_profiles=enrich'
</code></pre>
<p>That would return you 10 "enriched" (more information) founders working in the computer software industry.</p>
<div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Note: </strong></b>You can <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co" rel="noreferrer">create your Proxycurl account for free right here</a> and test out a few API queries using the trial credits you'll receive. <br>You'll get 100 trial credits if you sign up with a work email, 10 credits with a personal email.</div></div><p>Then, if you found a prospect of interest that was returned by our Person Search Endpoint and were interested in reaching out, you could use our Personal Email Lookup Endpoint to get their email.</p>
<h3 id="enriching-prospects-with-emails">Enriching prospects with emails</h3>
<p>Here's how:</p>
<pre><code class="language-bash">curl \
    -G \
    -H "Authorization: Bearer ${YOUR_API_KEY}" \
    'https://nubela.co/proxycurl/api/contact-api/personal-email' \
    --data-urlencode 'Professional Social Network_profile_url=https://www.professionalsocialnetwork.com/in/exampleprofile/'
</code></pre>
<p>That would take the given Professional Social Network URL from the Person Search Endpoint, and return you their personal email if available.</p>
<h3 id="generating-large-lead-lists-to-act-as-a-dataset-for-your-ai-agent">Generating large lead lists to act as a dataset for your AI agent</h3>
<p>Now let's say you want to generate a large lead list to use as a dataset for your AI agent.</p>
<p>We could use a little bit of <a href="https://www.python.org/?ref=nubela.co">Python</a> to help us accomplish this:</p>
<pre><code class="language-python">import requests
import os
import csv
import time

CSV_FILE_PATH = "./exported_data.csv"
API_KEY = "Your_API_KEY_Here"


# Function to search for people and handle pagination
def search_person(api_key, max_results):
    url = "https://nubela.co/proxycurl/api/v2/search/person"
    headers = {"Authorization": f"Bearer {api_key}"}

    params = {
        'country': 'US',
        'current_role_title': 'founder',
        'industries': 'Computer Software',
        'page_size': '10',
        'enrich_profiles': 'enrich'
    }

    results = []
    try:
        while len(results) &lt; max_results:
            response = requests.get(url, headers=headers, params=params)

            if response.status_code == 429:
                print("Rate limit hit, sleeping for a while...")
                time.sleep(10)
                continue

            response.raise_for_status()
            data = response.json()

            if not data.get("results"):
                print("No more results to fetch.")
                break

            results.extend(data.get("results", []))
            print(f"Fetched {len(results)} results so far.")

            if data.get("next_page") and len(results) &lt; max_results:
                url = data["next_page"]
            else:
                break

        return results[:max_results]
    except requests.exceptions.RequestException as e:
        print(f"Error in search_person: {e}")
        return []


# Lookup personal email function
def lookup_personal_email(api_key, Professional Social Network_url):
    url = 'https://nubela.co/proxycurl/api/contact-api/personal-email'
    headers = {'Authorization': f'Bearer {api_key}'}
    params = {'Professional Social Network_profile_url': Professional Social Network_url}

    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()
        data = response.json()
        return ', '.join(data.get('emails', [])) or 'N/A'
    except requests.exceptions.RequestException as e:
        print(f"Error fetching personal email for {Professional Social Network_url}: {e}")
        return 'N/A'


# Create new CSV if needed
def create_new_csv(file_name):
    with open(file_name, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow([
            "First Name", "Last Name", "Professional Social Network URL", "Occupation", "Summary",
            "Current Company", "Current Company Description", "Company URL",
            "Experiences", "Personal Email"
        ])
    print(f"New CSV file created: {file_name}")


# Export data to CSV with handling for missing profile data
def export_to_csv(data, file_name=CSV_FILE_PATH):
    print(f"Starting export to CSV: {file_name}")

    if not os.path.exists(file_name):
        create_new_csv(file_name)

    try:
        with open(file_name, mode='a', newline='', encoding='utf-8') as file:
            writer = csv.writer(file)

            for person in data:
                Professional Social Network_url = person.get("Professional Social Network_profile_url", "N/A")
                profile = person.get("profile", {})

                if not profile:
                    print(f"Profile missing for {Professional Social Network_url}, skipping...")
                    continue

                first_name = profile.get("first_name", "N/A")
                last_name = profile.get("last_name", "N/A")
                occupation = profile.get("occupation", "N/A")
                summary = profile.get("summary", "N/A")

                experiences = profile.get("experiences", [])
                experiences_list = []
                current_company = "N/A"
                current_company_description = "N/A"
                company_url = "N/A"

                if experiences and isinstance(experiences, list):
                    first_experience = experiences[0] if len(experiences) &gt; 0 else {}
                    current_company = first_experience.get("company", "N/A")
                    current_company_description = first_experience.get("description", "N/A")
                    company_url = first_experience.get("company_Professional Social Network_profile_url", "N/A")

                    for exp in experiences:
                        company_name = exp.get("company", "N/A")
                        title = exp.get("title", "N/A")
                        description = exp.get("description", "N/A")
                        start_date = exp.get("starts_at", {}).get("year", "N/A") if exp.get("starts_at") else "N/A"
                        end_date = exp.get("ends_at", {}).get("year", "N/A") if exp.get("ends_at") else "N/A"
                        exp_string = f"Company: {company_name}, Title: {title}, Description: {description}, Start: {start_date}, End: {end_date}"
                        experiences_list.append(exp_string)
                    experiences_str = " | ".join(experiences_list)
                else:
                    experiences_str = "N/A"

                personal_email = lookup_personal_email(API_KEY, Professional Social Network_url)

                writer.writerow([
                    first_name, last_name, Professional Social Network_url, occupation, summary,
                    current_company, current_company_description, company_url,
                    experiences_str, personal_email
                ])
                print(f"Added row for {first_name} {last_name}")

        print(f"Data successfully exported to {file_name}")
    except Exception as e:
        print(f"Error in export_to_csv: {e}")


# Start the process of fetching and exporting data
def start_process(max_results):
    try:
        search_results = search_person(API_KEY, max_results)
        if not search_results:
            print("No results found.")
            return
        export_to_csv(search_results)
    except Exception as e:
        print(f"Error in start_process: {e}")


if __name__ == '__main__':
    start_process(max_results=500)
</code></pre>
<h3 id="how-to-use-the-script">How to use the script</h3>
<p><strong>1.</strong> Make sure you have Python installed.</p>
<p>To run the script you would first need to have Python installed. An easy way to work with Python is to install an Integrated Development Environment (IDE) like <a href="https://www.jetbrains.com/pycharm/?ref=nubela.co">PyCharm</a>.</p>
<p>Also, install the <code>requests</code> module if you haven’t already using Python's package manager.</p>
<p>Just run the following command from your terminal or command prompt:</p>
<pre><code class="language-bash">pip3 install requests
</code></pre>
<p><strong>2.</strong> Replace <code>Your_API_Key_Here</code> with your actual <a href="https://nubela.co/proxycurl/dashboard/proxycurl-api/api-key/?ref=nubela.co">Proxycurl API key</a> in the script.</p>
<p><strong>3.</strong> Execute the script:</p>
<p><code>python3 your_script_name.py</code></p>
<p><strong>4.</strong> After running the above Python script, it would return you a <code>.CSV</code> list of <strong>500 founders of computer software companies</strong>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/script-output-1.png" class="kg-image" alt="An example of the CSV returned" loading="lazy" width="2852" height="1428"><figcaption><span style="white-space: pre-wrap;">An example of the CSV returned</span></figcaption></figure><p>The data points it includes are:</p>
<ul>
<li>First name</li>
<li>Last name</li>
<li>Professional Social Network profile URL</li>
<li>Occupation</li>
<li>Summary (a brief overview of the individual's profile)</li>
<li>Current company name</li>
<li>Current company description</li>
<li>Current company Professional Social Network URL</li>
<li>Experiences (a summary of job experiences, including company names, job titles, descriptions, start and end dates)</li>
<li>Personal email (if available)</li>
</ul>
<p>For all prospects, and can return even more if you want to add more of the results available on our Person Search Endpoint, which <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-person-search-endpoint">you can view on our documentation here</a>.</p>
<p>Note that this can consume quite a bit of credits, so you might want to <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">review our pricing here</a> first and lower the amount of results returned by the Python script by changing <code>max_results</code>.</p>
<h3 id="modifying-the-filtering-for-the-script">Modifying the filtering for the script</h3>
<p>You can adjust the search parameters in the params dictionary inside the <code>search_person</code> function.</p>
<p>For example, if you want to search for <strong>marketing managers in the UK</strong> instead of founders in the US, you can update the parameters like this:</p>
<pre><code class="language-python">params = {
    'country': 'GB',
    'current_role_title': 'marketing manager',
    'industries': 'Marketing and Advertising',
    'page_size': '10',
    'enrich_profiles': 'enrich'
}
</code></pre>
<p>But that's far from it when it comes to filtering and search options. <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-person-search-endpoint">You can view the available search parameters here</a>.</p>
<p>Feel free to modify the parameters to match your Ideal Customer Profile (ICP) based on job titles, industries, locations, or other available filters.</p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Note: </strong></b>The above script only uses "personal emails," but you'll find that sometimes personal emails as well as work emails will be returned. You can also add work emails to this via our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-work-email-lookup-endpoint" rel="noreferrer">Work Email Lookup Endpoint</a>, but you'll have to configure a webhook as this endpoint functions asynchronously. You could use something like <a href="https://flask.palletsprojects.com/en/3.0.x/?ref=nubela.co" rel="noreferrer">Flask</a> and <a href="https://ngrok.com/?ref=nubela.co" rel="noreferrer">ngrok</a> to accomplish that locally. I've skipped that for the sake of keeping this article to the point, but it isn't too difficult.</div></div><h2 id="creating-ai-agents-with-zapier-central">Creating AI agents with Zapier Central</h2>
<p>Cool. Now we have a dataset to work with.</p>
<p>For the next step, in order to bring this all together, we'll be using <a href="https://zapier.com/central?ref=nubela.co">Zapier Central</a>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier.png" class="kg-image" alt="Zapier's AI assistants" loading="lazy" width="2000" height="1081"><figcaption><span style="white-space: pre-wrap;">Zapier's AI assistants</span></figcaption></figure><p>Zapier is well known for integrating systems/apps. It's what allows you to piece together all of the different moving parts of your workflow.</p>
<p>And now they've dipped their toes into AI agents too. Best of all they'll allow you 400 activities per month and live data sources plus web browsing <a href="https://zapier.com/l/central-pricing?ref=nubela.co">for free</a>.</p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Note: </strong></b>For a self-hosted option, <a href="https://n8n.io/integrations/agent/?ref=nubela.co" rel="noreferrer">you could also use n8n along with LangChain &amp; LLAMA 3</a> to create similar AI automation systems. But there are quite a bit more complexities, and I think you'll find you often don't save that much self-hosting things like this.</div></div><p>After creating your Zapier account, <a href="https://central.zapier.com/?ref=nubela.co">you can access Zapier Central right here</a>.</p>
<p>You'll then see a dashboard similar to below:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-central.png" class="kg-image" alt="Zapier Central's dashboard" loading="lazy" width="2000" height="1055"><figcaption><span style="white-space: pre-wrap;">Zapier Central's dashboard</span></figcaption></figure><p>Click the "Plus" icon to create a new AI agent:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-central-2.png" class="kg-image" alt="Creating a new AI agent" loading="lazy" width="2000" height="1127"><figcaption><span style="white-space: pre-wrap;">Creating a new AI agent</span></figcaption></figure><h2 id="ai-agents-for-lead-identification-and-ranking">AI agents for lead identification and ranking</h2>
<p>Next up you'll need a name and description, which is whatever you'd like. Then the instructions which will apply to every conversation.</p>
<p>In this case, we can use something like, <em>"your job is to be a member of my sales team and help me prospect plus close sales."</em></p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-3.png" class="kg-image" alt="Configuring your AI agent" loading="lazy" width="2111" height="1401"><figcaption><span style="white-space: pre-wrap;">Configuring your AI agent</span></figcaption></figure><p>As of right now, Zapier Central's best way to natively integrate with business suite tools is by using Google's suite of tools. Such as Google Docs and Gmail.</p>
<p>To be honest with you, though, for outreach, Gmail is one of the best options you can use as there are a significant amount of Gmail users, and Gmail would much prefer mail came from their own infrastructure. Google's line of products aren't <em>too</em> expensive.</p>
<p>Anyway, you'll want to authenticate Zapier with your Google account and you'll be able to directly sync.</p>
<p>Then for your actions:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-4.png" class="kg-image" alt="Zapier's AI actions" loading="lazy" width="1702" height="1194"><figcaption><span style="white-space: pre-wrap;">Zapier's AI actions</span></figcaption></figure><p>Select Gmail "Create draft," and Google Docs "Create document from text."</p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Note: </strong></b>You can also select "send email" instead of create draft, but this will indeed automatically and directly send the email. It's up to you if you want to review things before they get sent out or not.</div></div><p>Then upload the <a href="google.com"><code>.CSV</code> full of prospects</a> we generated earlier with Proxycurl as the data source:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-5.png" class="kg-image" alt="Adding your data source for your AI agent" loading="lazy" width="1708" height="1334"><figcaption><span style="white-space: pre-wrap;">Adding your data source for your AI agent</span></figcaption></figure><p>It should look similar to this:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-6.png" class="kg-image" alt="Everything configured" loading="lazy" width="2064" height="1400"><figcaption><span style="white-space: pre-wrap;">Everything configured</span></figcaption></figure><p>Then click "Save" and "Create assistant."</p>
<p>Next, open your assitant, and you'll see a page such as this:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-7.png" class="kg-image" alt="Your new AI assistant" loading="lazy" width="2000" height="1118"><figcaption><span style="white-space: pre-wrap;">Your new AI assistant</span></figcaption></figure><p>Click on "Behaviors" in the middle and then "Create behavior":</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-8.png" class="kg-image" alt="Creating your AI agents behaviors" loading="lazy" width="2000" height="1132"><figcaption><span style="white-space: pre-wrap;">Creating your AI agents behaviors</span></figcaption></figure><p>For the trigger, there are a couple of different options you can choose:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/ai-agents-trigger.png" class="kg-image" alt="Triggering your AI agent" loading="lazy" width="1713" height="1283"><figcaption><span style="white-space: pre-wrap;">Triggering your AI agent</span></figcaption></figure><p>Such as Slack, a scheduled time, a Gmail action, or more. In this case I'll simply select when I message the assistant the word "Start."</p>
<p>Next up you'll need to fill out the instructions to follow (prompt) section.</p>
<p>So, for mine, here's what I used:</p>
<pre><code>I work for Proxycurl, a B2B data provider &amp; API. We want to target technical founders that could use our B2B data in their business. I want you to use the .CSV and the data provided to first rank the top 100 prospects and give a brief explanation why, then save them in a Google Document. 

After that, get rid of the ones unlikely to convert, and  draft an outreach email to the rest pitching a simple and short email to book a call. It should utilize the data provided, such as the summary and position/role to personalize the email and convey value.

For each row in the Leads spreadsheet, do ALL of the following steps:
1. Use the name and email to populate contact information. 
2. Use any information available about the contact to create a draft an email. 
3. Generate the body and subject.
4. Sign the email with: "Looking forward to connecting!" and "[your name here]"

Here's an example for the company AgentHub with the contact AgentHub team: 

Hey AgentHub team,

Just checked out your platform, and I'm impressed with how easily one can drag and drop to create AI-driven workflow automations. I'd love to connect and explore  explore how our product could help you unlock more potential.

Here's a link to my calendar if you want to chat this week!
[https://calendly.com/proxycurl]
</code></pre>
<p>Of course you'll want to slightly alter it your liking and what fits you and your business.</p>
<p>Then click on the "Test behavior" button:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zapier-9.png" class="kg-image" alt="Seeing how your AI agent will behave based on your instructions" loading="lazy" width="2000" height="1135"><figcaption><span style="white-space: pre-wrap;">Seeing how your AI agent will behave based on your instructions</span></figcaption></figure><p>It will display the following response, showing you <strong><em>step-by-step</em></strong> what it will be doing and the logic behind it: </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/1.png" class="kg-image" alt="First, analyzing the .CSV file" loading="lazy" width="1584" height="1162"><figcaption><span style="white-space: pre-wrap;">First, analyzing the .CSV file</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/2.png" class="kg-image" alt="Then, save the prospects in a document" loading="lazy" width="1648" height="1496"><figcaption><span style="white-space: pre-wrap;">Then, save the prospects in a document</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/3.png" class="kg-image" alt="The preview of the prospects" loading="lazy" width="1666" height="1340"><figcaption><span style="white-space: pre-wrap;">The preview of the prospects</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/4.png" class="kg-image" alt="Done" loading="lazy" width="1674" height="966"><figcaption><span style="white-space: pre-wrap;">Done</span></figcaption></figure><p>You can tell the AI agent to tweak it to your specific needs.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/5-1.png" class="kg-image" alt="Give it specific instructions" loading="lazy" width="1712" height="1314"><figcaption><span style="white-space: pre-wrap;">Give it specific instructions</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/email-preview-1.png" class="kg-image" alt="The email draft created" loading="lazy" width="1672" height="1140"><figcaption><span style="white-space: pre-wrap;">The email draft created</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/6.png" class="kg-image" alt="Done, do you want to further scale the actions?" loading="lazy" width="1698" height="800"><figcaption><span style="white-space: pre-wrap;">Done, do you want to further scale the actions?</span></figcaption></figure><p><br>Gmail draft result:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/result--email.png" class="kg-image" alt="Actual draft in Gmail" loading="lazy" width="1188" height="1216"><figcaption><span style="white-space: pre-wrap;">Actual draft in Gmail</span></figcaption></figure><p><br>Google document result:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/result---gdoc.png" class="kg-image" alt="The results automatically saved in Google Docs" loading="lazy" width="2320" height="1278"><figcaption><span style="white-space: pre-wrap;">The results automatically saved in Google Docs</span></figcaption></figure><h2 id="give-your-ai-agents-quality-data-clear-instructions-and-youre-all-set">Give your AI agents quality data &amp; clear instructions, and you're all set</h2>
<p>Neat, don't you think? You can now create reports automatically and even create highly personalized emails that are based on accurate data. Gone were the days when you have to manually copy and paste email addresses and read boring Excel spreadsheet to customize your email. Now you can just tell AI agent what you want and it will do it.</p>
<p>Is that all that you can do with it? No, of course. Truly, the limit is your imagination, find your most repetitive and boring task and let the AI agent do it!</p>
<p>Of course, us being at Proxycurl will emphasize the importance of having quality data to feed to your AI agents, so that they can perform their intended tasks to the best that they can.</p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">🚀</div><div class="kg-callout-text">At Proxycurl, we have a full suite of <a href="https://proxycurl.com/?ref=nubela.co">API products</a> and a <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkDB database</a> product consisting of close to 500 million profiles that powers many, many amazing applications and use cases, like AI agents. <br><a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co" rel="noreferrer">Sign up for an account</a> and get started now!</div></div><p></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How To Build A Crunchbase Scraper In 2025 - With Code Demo ]]></title>
        <description><![CDATA[ We walk you through the process of building a Crunchbase scraper from scratch, including all the technical details and code using Python; and a great alternative: Proxycurl where you can pull the same company information using just a few lines of code. ]]></description>
        <link>https://nubela.co/blog/build-a-crunchbase-scraper/</link>
        <guid isPermaLink="false">6704e1b47e7620000156f2e9</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Sese | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/IMG_4677.jpeg"/>
        <pubDate>Wed, 09 Oct 2024 17:12:09 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>In a time where data is worth its weight in gold, Crunchbase is a goldmine. It’s home to thousands of company profiles, their investment data, leadership position, funding information, news and much more. Crunchbase scraping will allow you to get to the gold chunks (the insights you need) and filter out all the debris (all the other information irrelevant to you).</p>
<p>In this article, we’ll walk you through the process of building a Crunchbase scraper from scratch, including all the technical details and code using Python, with a working demo for you to follow along. With that being said, you should also understand that building a Crunchbase scraper is a time consuming task, with many challenges along the way. That is why we will also go through a demo of an alternative approach using Proxycurl, a paid API-based tool that does the work for you. With both options on the table, you can weigh their advantages and choose the one that best fits your needs.</p>
<p>Here’s a sneak peak at a basic Crunchbase scraper using Python to extract company name and headquarter city from the website.</p>
<pre><code class="language-python">import requests
from bs4 import BeautifulSoup

url = 'https://www.crunchbase.com/organization/apple'
headers = {'User-Agent': 'Mozilla/5.0'}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')

name_section = soup.find('h1', class_='profile-name')
company_name = name_section.get_text(strip=True) if name_section else 'N/A'

headquarters_section = soup.find('span', class_='component--field-formatter field_type_text')
headquarters_city = headquarters_section.get_text(strip=True) if headquarters_section else 'N/A'

print(f"Company Name: {company_name}")
print(f"Headquarters City: {headquarters_city}")
</code></pre>
<p>Now, to our alternative approach, Proxycurl. It is a comparably efficient Crunchbase scraping tool and you can pull the same company information using just a few lines of code. The added benefit here is you won’t have to worry about HTML parsing or any scraping roadblocks with Proxycurl.</p>
<pre><code class="language-python">import requests

api_key = 'YOUR_API_KEY'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/company'
params = {
    'url': 'https://www.professionalsocialnetwork.com/company/apple/',
    }

response = requests.get(api_endpoint, params=params, headers=headers)
data = response.json()

print(f"Company Name: {data['company_name']}")
print(f"Company Headquarter: {data['hq']['city']}")
</code></pre>
<p>By the end of this article, you'll be familiar with both methods and be able to make an informed decision. So whether you're excited to roll up your sleeves and code your own scraper or you’re after a one stop solution, keep reading to set up your Crunchbase scraper.</p>
<h2 id="building-your-crunchbase-scraper-from-scratch">Building your Crunchbase Scraper from scratch</h2>
<p>Crunchbase contains several data types including acquisitions, people, events, hubs and funding rounds. For this article, we will go through building a simple Crunchbase scraper to parse out a company's description to retrieve as JSON data. Let’s go with Apple for our example.</p>
<p>First, we will need to define a function to extract the company description. The <code>get_company_description()</code> function searches for the <code>span</code> HTML element that contains the company’s description. It then extracts the text and returns it:</p>
<pre><code class="language-python">def get_company_description(raw_html):
    description_section = raw_html.find("span", {"class": "description"})
    return description_section.get_text(strip=True) if description_section else "Description not found"
</code></pre>
<p>This sends an HTTP GET request to the URL of the company profile you want to scrape, in this case, Apple’s profile. Here’s what the full code looks like:</p>
<pre><code class="language-python">import requests
from bs4 import BeautifulSoup

def get_company_description(raw_html):
    # Locate the description section in the HTML
    description_section = raw_html.find("span", {"class": "description"})
    
    # Return the text if found, else return a default message
    return description_section.get_text(strip=True) if description_section else "Description not found"

# URL of the Crunchbase profile to scrape
url = "https://www.crunchbase.com/organization/apple"
# Set the User-Agent header to simulate a browser request
headers = {"User-Agent": "Mozilla/5.0"}

# Send a GET request to the specified URL
response = requests.get(url, headers=headers)

# Check if the request was successful (status code 200)
if response.status_code == 200:
    # Parse the HTML content of the response using BeautifulSoup
    soup = BeautifulSoup(response.content, "html.parser")
    
    # Call the function to get the company description
    company_description = get_company_description(soup)
    
    # Print the retrieved company description
    print(f"Company Description: {company_description}")
else:
    # Print an error message if the request failed
    print(f"Failed to retrieve data. Status Code: {response.status_code}")
</code></pre>
<p>This script does the trick for pulling Apple’s company description from Crunchbase. Depending on your experience and what you are looking for, things can get a lot trickier. Handling large volumes of data, managing pagination, bypassing authwall mechanisms, there are a lot of hurdles along the way. Keep in mind that you will have to:</p>
<ul>
<li>Perform this action for every single field you’re interested in.</li>
<li>Stay updated with any modifications in the web page. Even a small change in how a field is presented in the website can result in a minor or a significant tweak in the scraping logic.</li>
</ul>
<p><em><strong>Note</strong>: Check the website’s terms of service and <code>robots.txt</code> file to ensure you're scraping responsibly and within legal limits.</em></p>
<h2 id="why-is-building-a-crunchbase-scraper-challenging">Why is building a Crunchbase Scraper challenging?</h2>
<p>Building your own Crunchbase scraper is a viable option, but before you go Gung-ho, be aware of what challenges await you.</p>
<h3 id="accuracy-and-completeness">Accuracy and completeness</h3>
<p>Your efforts will be meaningless if the extracted data is false. Manually scraping raises the margin of error, and the code may overlook important data if the page doesn't fully load or if some content is embedded in iframes or external resources.</p>
<h3 id="crunchbases-structure-and-changes">Crunchbase's structure and changes</h3>
<p>Parsing the HTML of a webpage to extract specific data fields is a basic step in scraping. Crunchbase's HTML is complex, with dynamic elements and multiple layers of containers. It is a task in itself to identify and target the right data. This added with the website’s changing structure can make your job tenfold tougher.</p>
<h3 id="handling-authwalls-and-anti-scraping-mechanisms">Handling authwalls and anti-scraping mechanisms</h3>
<p>Crunchbase protects most of their data behind an authwall and will require login credentials or a premium account. Handling login sessions, tokens, or cookies in the scraper manually makes the task more complex, especially for maintaining these sessions across multiple requests. Similarly, Crunchbase uses bot detection systems and rate-limits requests. You run a risk of getting blocked, and bypassing these protections means implementing techniques such as rotating proxies or handling CAPTCHAs, which is easier said than done.</p>
<p>Building your own Crunchbase scraper gives you flexibility and a sense of accomplishment, but weigh that against the challenges involved. It demands deep technical expertise, constant monitoring and effort to get the data you want. This is without mentioning how time-consuming and prone to errors the process can be. Consider whether the effort and maintenance are truly worth it for your needs.</p>
<h2 id="the-hassle-free-way-to-set-up-a-crunchbase-scraper">The hassle-free way to set up a Crunchbase Scraper</h2>
<p>Phew! Building your Crunchbase Scraper from scratch sure is some serious work. Not only do you have to dedicate a lot of your time and effort, but also keep an eye out for potential challenges. Thank god <a href="https://nubela.co/proxycurl/?ref=nubela.co">Proxycurl</a> exists!</p>
<p>Take advantage of Proxycurl’s endpoints and get all the data you could ever wish for in JSON format. And since Crunchbase only provides public data available on the company, there is no data out of your reach. Any private information scraping attempt will result in 404. Rest assured, you will never be charged for a request that returns an error code.</p>
<p>Proxycurl provides you with a list of standard fields under the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api">Company Profile Endpoint</a>. You can see a full example of any response in the documentation on the right-hand side below the request that generated it. Proxycurl has the ability to scrape the following fields at your request:</p>
<ul>
<li><code>categories</code></li>
<li><code>funding_data</code></li>
<li><code>exit_data</code></li>
<li><code>acquisitions</code></li>
<li><code>extra</code></li>
</ul>
<p>Each of these fields that you request comes at an additional credit cost, so choose only the parameters you require. But when you do need them, Proxycurl puts them a single parameter away!</p>
<p>Now that we are familiar with Proxycurl, let's walk through a working demo. We'll include two examples, for Postman and then for Python.</p>
<h2 id="crunchbase-scraping-with-proxycurl-via-postman">Crunchbase scraping with Proxycurl via Postman</h2>
<h3 id="step-1-set-up-your-account-and-get-your-api-key">Step 1: Set up your account and get your API key</h3>
<p>Create an account with <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">Proxycurl</a> and you’ll be assigned with a unique API key. Proxycurl is a paid API, and you would need to authenticate every request with a bearer token (your API key). You will also receive <strong>100 credits</strong> if you signed up with your work email, <strong>10 credits</strong> if you used personal email. Then you can start experimenting immediately! Here’s what your dashboard should look like.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/Proxycurl-dashboard-1.jpg" class="kg-image" alt="Proxycurl dashboard where you can get your API key" loading="lazy" width="2000" height="1131"><figcaption><span style="white-space: pre-wrap;">Proxycurl dashboard where you can get your API key</span></figcaption></figure><p>From here, you can scroll down and choose to work with <a href="https://nubela.co/proxycurl/people-api?ref=nubela.co">Person Profile Endpoint</a> or the <a href="https://nubela.co/proxycurl/company-api?ref=nubela.co">Company Profile Endpoint</a>. The Person Profile Endpoint is a useful tool if you're looking to scrape Professional Social Network. Check out [How to Build a Professional Social Network Data Scraper](<a href="https://nubela.co/blog/how-to-build-a-Professional">https://nubela.co/blog/how-to-build-a-Professional</a> Social Network-data-scraper/) for further details.<br>
For this use case, we’ll just be working with the Company Profile Endpoint.</p>
<h3 id="step-2-run-postman-and-set-your-bearer-token">Step 2: Run Postman and set your bearer token</h3>
<p>Go to <a href="https://pxlcl.co/proxycurl-postman-collection?ref=nubela.co">Proxycurl's collection in Postman</a>, click on the Company Profile Endpoint doc and find the orange button that says "Run in Postman" and click it. Then click "Fork Collection" and log in however you like. It should look something like this. We have a full tutorial on <a href="https://nubela.co/blog/tutorial-to-test-proxycurl-apis-with-postman-beginners-guide/">how to set up Proxycurl API in Postman</a>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcynLmxv_xilq9mjeg-CfflUeQRycZ9LmVtGbnofSADZ61BJ_kuc-RwTzoIHtPJYNLRWbWWTV8ID7nrQMfzDNEeKRr07c78RaUfQrpJVEwZQMemxDsnlVUcHmEgMLLJLygBDkeTNRFBk4b4xSOuJ2NjC5Y?key=3kyG2jBGWleZ6m1_0vABVA" class="kg-image" alt="Setting up Proxycurl API in Postman" loading="lazy" width="1600" height="905"><figcaption><span style="white-space: pre-wrap;">Setting up Proxycurl API in Postman</span></figcaption></figure><p>Once you’re in Postman, go to Authorization, choose Bearer Token and add your token (your API Key) and limit it to Proxycurl. You can do this from the Variables tab or from the pop-up that appears when you start typing into the "Token" field. Name the token to your liking, or just go with the name, Bearer Token.</p>
<p>Verify that the Authorization type is set to "Bearer Token" and that you have typed {{Bearer Token}} into the Token field and click Save in the upper right-hand corner. <em>Remember to click Save!!</em> Your page should look like this:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfvC_3ei0sPFVYpl84jIu-8jDekEP1YH8zHnc97OeXpE3aaoSpCagcTLrtxSrQwA8HbAfq27R05VeZ2oyEDjW092RHSonrlaZawl_8e6pRrWDoEMFGESHFC5BxCD_TkJ4CHRcrzXubqi81SjzCnDqUK210?key=3kyG2jBGWleZ6m1_0vABVA" class="kg-image" alt="Add Bearer Token as the Authorization type" loading="lazy" width="1600" height="371"><figcaption><span style="white-space: pre-wrap;">Add Bearer Token as the Authorization type</span></figcaption></figure><h3 id="step-3-navigate-to-your-workspace">Step 3: Navigate to your workspace</h3>
<p>On the left-hand side, under "My workspace", go to your Proxycurl collection and then the Company API. You will find a list of options on the dropdown menu, but here’s what you will need to know:</p>
<ul>
<li><a href="https://nubela.co/proxycurl/company-api?ref=nubela.co">Company Profile Endpoint</a>: Enriches company profile with Crunchbase data like funding, acquisitions, etc. You will need to use the company’s Professional Social Network profile URL as input parameter to the API.</li>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-company-lookup-endpoint">Company Lookup Endpoint</a>: Input a company’s website and get its Professional Social Network URL.</li>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-company-search-endpoint">Company Search Endpoint</a>: Input various search parameters and find a list of companies that matches that search criteria, and then pull Crunchbase data for these companies.</li>
</ul>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdLHSPUp1Rox76urpfU55qri2yo1EGKUfHjYnTwTyWO9NSSbOJ7KvcwruhKDcSrQZQ_25H833tfSbyx1BA77fkx5JapRgvFUkQJxXv5GAh2JltEnnMcc0XaGR_TGU-ou7FFQIEnxPFV2kkt4QWVFnHBg3a2?key=3kyG2jBGWleZ6m1_0vABVA" class="kg-image" alt="The various company-related endpoints" loading="lazy" width="744" height="676"><figcaption><span style="white-space: pre-wrap;">The various company-related endpoints</span></figcaption></figure><h3 id="step-4-edit-your-params-and-send">Step 4: Edit your params and send!</h3>
<p>Go to Company Profile Endpoint and from there, you can uncheck some of the fields if you want or modify others. For instance, you might want to change <code>use_cache</code> from <code>if-present</code> to <code>if-recent</code> to get the most up-to-date info, but maybe you don't need the acquisitions information this time.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdCjSyWAzdWkb-N-NL6iMkgAo-io8kGVkj2NGJeZhiSZWBjF5WfZEk_ICMNc_I9hlUTsG9F3MnjrUcFZV7aUVnfUvbaorNQ7a00Xy5HWPegSnvuFb39zxePQBvIQo4JeAO3Uq3hmmuBVL56e0X-6BEZAZ-4?key=3kyG2jBGWleZ6m1_0vABVA" class="kg-image" alt="Choose the relevant fields that you need. Some cost extra credits." loading="lazy" width="600" height="188"><figcaption><span style="white-space: pre-wrap;">Choose the relevant fields that you need. Some cost extra credits.</span></figcaption></figure><p>Once you've modified all the fields to your liking, click the blue "Send" button in the upper left-hand corner. Your output should look something like this.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe1OmI25157HHoN6KRy34j04uyIrPCsj1YMqMFBWfMC1cQCAP4_dnh_1ax_vUykMYKeeVaoTT0mmif6iPggsagI7Rdof0b2wJguw-BNXf91pBn1Hp-2m3bIzbPrkj4hGOrJymEyGSf1nQkKiE7LU_bDKCIC?key=3kyG2jBGWleZ6m1_0vABVA" class="kg-image" alt="Output from Proxycurl's Company Profile Endpoint" loading="lazy" width="1600" height="889"><figcaption><span style="white-space: pre-wrap;">Output from Proxycurl's Company Profile Endpoint</span></figcaption></figure><p>If you come across a 401 status code, it is most likely you forgot to hit Save after setting the Authorization type to {{Bearer Token}} in Step 2. A good way to troubleshoot this is to see if you can fix it by editing the Authorization tab for this specific query to be the {{Bearer Token}} variable. If that fixes it, then the auth inheritance isn't working, which probably means you forgot to save.</p>
<h2 id="crunchbase-scraping-with-proxycurl-via-python">Crunchbase scraping with Proxycurl via Python</h2>
<p>Now let’s try and do the same with Python. In the Proxycurl docs under <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-company-profile-endpoint">Company Profile Endpoint</a>, you can toggle between shell and Python. We’ll use the company endpoint to pull Crunchbase-related data, and it’s as simple as switching to Python in the API docs.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe83WwDPg5YVG7N8WH5tH-2gMmuHTVWT8x5Vnti0z0yIYwq91Tddu-G4WfAKNfR5sn8ta1g5tBC3m1x8K_i08P-OWdL83uz9pMjPR_WLZZn4Rvq-5aL1-YcoHYYbJ1elizVc2-gvPr92-f5hr4fws8iyS4?key=3kyG2jBGWleZ6m1_0vABVA" class="kg-image" alt="Toggle between shell and Python" loading="lazy" width="600" height="628"><figcaption><span style="white-space: pre-wrap;">Toggle between shell and Python</span></figcaption></figure><p>Now, we can paste in our API key where it says <code>YOUR_API_KEY</code>. Once we have everything set up, we can extract the JSON response and print it. Here’s the code for that, and you can make changes to it as needed:</p>
<pre><code class="language-python">import requests

api_key = 'YOUR_API_KEY'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/company'
params = {
    'url': 'https://www.professionalsocialnetwork.com/company/apple/',
    'categories': 'include',
    'funding_data': 'include',
    'exit_data': 'include',
    'acquisitions': 'include',
    'extra': 'include',
    'use_cache': 'if-present',
    'fallback_to_cache': 'on-error',
}

response = requests.get(api_endpoint, params=params, headers=headers)
print(response.json())
</code></pre>
<p>Now, what you get is a structured JSON response that includes all the fields that you have specified. Something like this:</p>
<pre><code class="language-python">"Professional Social Network_internal_id": "162479",
   "description": "We're a diverse collective of thinkers and doers, continually reimagining what's possible to help us all do what we love in new ways. And the same innovation that goes into our products also applies to our practices -- strengthening our commitment to leave the world better than we found it. This is where your work can make a difference in people's lives. Including your own.\n\nApple is an equal opportunity employer that is committed to inclusion and diversity. Visit apple.com/careers to learn more.",
   "website": "http://www.apple.com/careers",
   "industry": "Computers and Electronics Manufacturing",
   "company_size": [
       10001,
       null
   ],
   "company_size_on_Professional Social Network": 166869,
   "hq": {
       "country": "US",
       "city": "Cupertino",
       "postal_code": "95014",
       "line_1": "1 Apple Park Way",
       "is_hq": true,
       "state": "California"
   },
   "company_type": "PUBLIC_COMPANY",
   "founded_year": 1976,
   "specialities": [
       "Innovative Product Development",
       "World-Class Operations",
       "Retail",
       "Telephone Support"
   ],
   "locations": [
       {
           "country": "US",
           "city": "Cupertino",
           "postal_code": "95014",
           "line_1": "1 Apple Park Way",
           "is_hq": true,
           "state": "California"
        }
                 ]
...... //Remaining Data
}
</code></pre>
<p>Great! Congratulations on your journey from zero to data!</p>
<h2 id="is-any-of-this-legal">Is any of this legal?</h2>
<p>Yes, scraping Crunchbase is legal. The legality of scraping is based on different factors like the type of data, the website’s terms of service, data protection laws like GDPR, and much more. The idea is to scrape for <strong>publicly available data</strong> within these boundaries. Since Crunchbase only houses public data, it is absolutely legal to scrape by operating within the <a href="https://about.crunchbase.com/terms-of-service/?ref=nubela.co">Crunchbase Terms of Service</a>.</p>
<h2 id="final-thoughts">Final thoughts</h2>
<p>A DIY Crunchbase scraper can be an exciting project and gives you full control over the data extraction process. But be mindful of the challenges that come with it. Facing a roadblock in each step can make scraping a time-consuming and often fragile process that requires technical expertise and constant maintenance.</p>
<p>Proxycurl provides a simpler and more reliable alternative. Follow along with the steps and you can access structured company data through an API without worrying about any roadblocks. Dedicate your time by focusing on using the data and leave the hard work and worry to Proxycurl!</p>
<p>We'd love to hear from you! If you build something cool with our API, let us know at <a href="mailto:hello@nubela.co">hello@nubela.co</a>! And if you found this guide useful, there's more where it came from - sign up for our newsletter!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Get Historical Employee Growth With Proxycurl&#x27;s Employee Count Endpoint ]]></title>
        <description><![CDATA[ We added a new feature to the Employee Count Endpoint: the `at_date` parameter, which will fetch historical employee count data of any company. Check out our docs. ]]></description>
        <link>https://nubela.co/blog/historical-employee-growth-with-employee-count-endpoint/</link>
        <guid isPermaLink="false">66f60e685ad68b0001185e7f</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 08 Oct 2024 15:11:49 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>I am excited to introduce you to the new <code>at_date</code> parameter to the Employee Count Endpoint, which will allow you to fetch historical employee count data of <em>any</em> company. Effectively, you will be able to build historical employee growth charts like this:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/NVIDIA-employee-growth-chart.jpg" class="kg-image" alt="NVIDIA historical employee growth chart" loading="lazy" width="1540" height="943"><figcaption><span style="white-space: pre-wrap;">Nvidia's employee growth trajectory over the past 4 years</span></figcaption></figure><p>Or employee count in tables like such:</p>
<table>
<thead>
<tr>
<th>Date</th>
<th>Professional Social Network Employee Count</th>
</tr>
</thead>
<tbody>
<tr>
<td>2022-12-01</td>
<td>31008</td>
</tr>
<tr>
<td>2023-01-01</td>
<td>31157</td>
</tr>
<tr>
<td>2023-02-01</td>
<td>31238</td>
</tr>
<tr>
<td>2023-03-01</td>
<td>31233</td>
</tr>
<tr>
<td>2023-04-01</td>
<td>31231</td>
</tr>
<tr>
<td>2023-05-01</td>
<td>31391</td>
</tr>
<tr>
<td>2023-06-01</td>
<td>31532</td>
</tr>
<tr>
<td>2023-07-01</td>
<td>31701</td>
</tr>
<tr>
<td>2023-08-01</td>
<td>31774</td>
</tr>
<tr>
<td>2023-09-01</td>
<td>31959</td>
</tr>
<tr>
<td>2023-10-01</td>
<td>32203</td>
</tr>
<tr>
<td>2023-11-01</td>
<td>32409</td>
</tr>
<tr>
<td>2023-12-01</td>
<td>32603</td>
</tr>
<tr>
<td>2024-01-01</td>
<td>33081</td>
</tr>
<tr>
<td>2024-02-01</td>
<td>33307</td>
</tr>
<tr>
<td>2024-03-01</td>
<td>33532</td>
</tr>
<tr>
<td>2024-04-01</td>
<td>33755</td>
</tr>
<tr>
<td>2024-05-01</td>
<td>34160</td>
</tr>
<tr>
<td>2024-06-01</td>
<td>34429</td>
</tr>
<tr>
<td>2024-07-01</td>
<td>34550</td>
</tr>
<tr>
<td>2024-08-01</td>
<td>34577</td>
</tr>
<tr>
<td>2024-09-01</td>
<td>34496</td>
</tr>
</tbody>
</table>
<p>For more information, see the API documentation for the <code>at_date</code> parameter for the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-count-endpoint">Employee Count Endpoint</a>.</p>
<h2 id="how-to-use-the-atdate-parameter">How To Use The <code>at_date</code> Parameter?</h2>
<p>Effectively, the <code>at_date</code> parameter lets you time travel into the past with a date with the ISO8601 representation of <code>YYYY-MM-DD</code>.</p>
<p>For example, this is how you can get Nvidia's employee count in September 2024:</p>
<pre><code class="language-python">curl \
  -G \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  'https://nubela.co/proxycurl/api/Professional Social Network/company/employees/count' \
  --data-urlencode 'url=https://www.professionalsocialnetwork.com/company/nvidia/' \
  --data-urlencode 'Professional Social Network_employee_count=include' \
  --data-urlencode 'at_date=2024-09-01' \
  --data-urlencode 'employment_status=current'
</code></pre>
<p>Note the <code>at_date=2024-09-01</code> parameter.</p>
<p>The response of this will be:</p>
<pre><code class="language-json">{
  "total_employee": 21854,
  "Professional Social Network_employee_count": 35023,
  "linkdb_employee_count": 21854
}
</code></pre>
<p>You will see that there are 2 employee counts under 2 similar looking labels, which might seem a bit confusing. Let me clarify:</p>
<ul>
<li><code>Professional Social Network_employee_count</code>: The employee count of this company from <em>its Professional Social Network profile</em> at the stated <code>at_date</code>.</li>
<li><code>linkdb_employee_count</code>: The total number of employees found in LinkDB for this company at the stated <code>at_date</code>. This value is limited by pre-crawled Professional Social Network profiles stored in <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkDB</a>.</li>
</ul>
<p><strong>In general, you will want to use the</strong> <code>Professional Social Network_employee_count</code> value.</p>
<hr>
<p>Similarly, to fetch the employee count for August 2024, all we have to do is to replace the <code>at_date</code> parameter with a new date: <code>at_date=2024-08-01</code> parameter, like this:</p>
<pre><code class="language-python">curl \
  -G \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  'https://nubela.co/proxycurl/api/Professional Social Network/company/employees/count' \
  --data-urlencode 'url=https://www.professionalsocialnetwork.com/company/nvidia/' \
  --data-urlencode 'Professional Social Network_employee_count=include' \
  --data-urlencode 'at_date=2024-08-01' \
  --data-urlencode 'employment_status=current'
</code></pre>
<h2 id="historical-employee-growth-as-an-investment-signal">Historical Employee Growth As An Investment Signal</h2>
<p>Historical employee growth data is a great way to judge a company's past performance, and hence a <a href="https://nubela.co/proxycurl/solutions/alternative-data-for-investment-firms?ref=nubela.co">great investment signal</a>. A company which is growing very fast is a good proxy for how fast they are growing in revenue; or if they had just raised a venture capital round.</p>
<p>The only quirk is that historical employee count data is a backwards looking metric. If you are seeking a forward looking metric, we have a <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#jobs-api-jobs-listing-count-endpoint">Job Listing Count API Endpoint</a>, which lets you identify how many open job posts there are for a given company. The total job post count is a good proxy for how fast a company might grow in the very near future.</p>
<h2 id="how-does-it-work">How does it work?</h2>
<p>In March 2023, we built a prototype to [count employees via historical snapshots](<a href="https://nubela.co/blog/using-proxycurls-historic-Professional">https://nubela.co/blog/using-proxycurls-historic-Professional</a> Social Network-employee-count-tool-for-investment-research/) and wrote a blog post about it while <a href="https://github.com/nubelaco/historic-employee-count-tool?ref=nubela.co">open sourcing the code</a> which leverages Proxycurl API as the data backend. It has proven to work extremely well, but the raw cost of Proxycurl primitive API endpoints makes it prohibitively expensive. It will cost tens if not hundreds of dollars per company to get a full historical employee count snapshot of any company.</p>
<p>The way the time travel feature is made possible via the introduction of the <code>at_date</code> parameter, is that it uses Proxycurl's APIs to scrape employee information from Professional Social Network, calculating employee trends by leveraging historical snapshots and employee profiles. For more details, you can refer to the full article about the [historical employee count tool that we built here](<a href="https://nubela.co/blog/using-proxycurls-historic-Professional">https://nubela.co/blog/using-proxycurls-historic-Professional</a> Social Network-employee-count-tool-for-investment-research/).</p>
<h2 id="how-much-does-it-cost">How much does it cost?</h2>
<p>The <code>at_date</code> parameter will cost <code>1</code> extra credit on top of the base cost of the endpoint for users on the <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">Growth or larger subscription</a>. For all other users, it will cost <code>5</code> extra credits.</p>
<p>If you are not already on our subscription plan, do consider upgrading! You will see <a href="https://nubela.co/blog/announcement-new-annual-plans-and-pricing-updates-2024/">everything on Proxycurl start to become cheaper</a>.</p>
<h2 id="questions">Questions?</h2>
<p>Should you have any questions about time travelling into the past via the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-count-endpoint">Employee Count Endpoint</a> and fetching the historical employee count, shoot me an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a> !</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Build a Lusha Sales Prospecting Clone with NextJS, Tailwind &amp; Proxycurl ]]></title>
        <description><![CDATA[ I built a minimal clone of Lusha&#39;s sales prospecting feature using NextJS, Tailwind CSS, and Proxycurl. Here you&#39;ll get a step-by-step guide with full codebase, paired with a working demo to replicate Lusha&#39;s prospect search feature, search Professional Social Network profiles, export data to CSV, a ]]></description>
        <link>https://nubela.co/blog/build-a-lusha-sales-prospecting-clone-with-nextjs-tailwind-proxycurl/</link>
        <guid isPermaLink="false">66ff5f4a5ad68b00011860eb</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Zeha Irawan | Senior Marketing Dev ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/zz.jpeg"/>
        <pubDate>Mon, 07 Oct 2024 16:23:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_408-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>I built a minimal clone of Lusha's sales prospecting feature, and in this article you'll get to see exactly how I did that:</p>
<ul>
<li>Where to get the data for the clone</li>
<li>Build the search and filter functions based on various person's parameters</li>
<li>Cache past searches</li>
<li>How to build the UI</li>
<li>And more</li>
</ul>
<p>At the very end, I appended the full code for this clone, which you can use straight away to build your own Lusha sales prospecting minimal clone to get that <a href="https://nubela.co/blog/i-cold-emailed-our-way-to-1m-arr-in-18-months-heres-the-story/">$1M ARR in 18 months</a>.</p>
<blockquote>
<p><strong>Quick update before we start:</strong> Proxycurl has been sunset. I built Proxycurl, and I now work on NinjaPear. I am leaving the original Proxycurl implementation in this article because the build flow is still useful, but wherever it matters, I am also showing you the working NinjaPear path so you do not follow a dead product.</p>
</blockquote>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/Recruitment</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Any-Substance3903</span>
<span style="color:#878a8c;">· ▲ 6</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">To get 110 contact numbers on Lusha, we had to build a project of 1100 on Linkedin. So only a 10% succcess rate. We called all 110 numbers and circa 40% of them wouldn't connect.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/Recruitment/comments/1ntm1p5/alternatives_to_lusha_for_ukeu_contacts/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the real reason this tutorial exists. Not because cloning SaaS UIs is cute. Because teams want the workflow, but they do not want to be boxed into one vendor's limits.</p>
<p><a href="https://lusha-clone-by-procxycurl.vercel.app/?ref=nubela.co">Access the original demo clone here</a>.</p>
<p>How it will look with a list of profiles returned:</p>
<p><img alt="A list of CFOs based on search input on the left" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/people-prospector-1.png" /></p>
<p>You get a list of CFOs based on your search input on the left.</p>
<p>Here is a quick sneak peek of the whole thing:</p>
<p><img alt="The full GIF tour of Lusha sales prospecting clone by Proxycurl" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/62473d246fecdad923269ca0_You-Belong-In-Tech-Product-Design.gif" /></p>
<p>A close-to-fully-functioning prospector with filters based on location, role and company.</p>
<h2 id="features-of-the-lusha-sales-prospecting-clone">Features of the Lusha sales prospecting clone</h2>
<p>This is the feature of Lusha that I cloned, their prospect search feature:</p>
<p><img alt="Lusha's sales prospect search image on homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/lusha.png" /></p>
<p>This is the Lusha prospect search feature I'm cloning. Source: Lusha homepage.</p>
<p>The clone will not have all the filters you see on the left above, because that would be the same as building a full SaaS tool already. Still, it is comprehensive enough to be useful.</p>
<p>The app will have the following features:</p>
<ul>
<li>Search LinkedIn profiles with country, job title and company</li>
<li>Export LinkedIn profiles to CSV</li>
<li>Save last 10 queries to recent searches in local storage</li>
<li>Save API key to local storage</li>
<li>View details modal to display person experiences and education</li>
</ul>
<h2 id="prerequisites">Prerequisites</h2>
<p>You'll need these to get started:</p>
<ul>
<li>Node v18+</li>
<li>A Proxycurl account, if you want to follow the original implementation in this article</li>
<li>A NinjaPear account, if you want the working replacement path</li>
<li>Basic knowledge of React.js and Next.js</li>
<li>Basic knowledge of Tailwind CSS</li>
</ul>
<p>Now, let's get building.</p>
<h2 id="register-for-a-proxycurl-account">Register for a Proxycurl account</h2>
<p><a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> was a data enrichment company offering APIs that pulled person data, company data, contact info and more. Users liked the ease of use, the ability to pull data from the get-go with just the API key, and the data freshness.</p>
<p>For the same reasons, it was the data enrichment tool that I used to feed this Lusha sales prospecting clone.</p>
<ol>
<li><a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">Register for an account here</a></li>
<li>Get <strong>100 free credits</strong> if you sign up with a work email, or <strong>10 credits</strong> for a personal email</li>
<li><a href="https://nubela.co/proxycurl/dashboard/proxycurl-api/api-key/?ref=nubela.co">Get your API key in the dashboard here</a></li>
</ol>
<h3 id="the-working-alternative-ninjapear">The working alternative: NinjaPear</h3>
<p>If you're building this today, use <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. The closest current replacement path is a mix of the <a href="https://nubela.co/companies?ref=nubela.co">Employee API</a> for person profiles from public sources, plus <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> if you want the spreadsheet-style workflow on top.</p>
<p>One important caveat: NinjaPear is not a drop-in 1:1 clone of old Proxycurl's exact Person Search endpoint. So if your goal is to learn the UI and query flow, the article still holds. If your goal is production, wire the same UI into NinjaPear's current people and company primitives instead of the sunset Proxycurl endpoint.</p>
<p>Users feel this same pain in the market too:</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Consistent_Code4808</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Cycle through most of the big players free trials to get a feel for them. Plus saves any spending for a few months! I have found most of them to be the same tbh but keep revisiting Linked Sales Nav and Apollo. Used to love crunchbase.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/comments/191cwxo/looking_for_alternatives_to_lusha_for_generating/kgwlt0o/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is why I would rather show you architecture you control than tell you to marry one data vendor forever.</p>
<h2 id="create-a-new-nextjs-project">Create a new Next.js project</h2>
<pre><code class="language-bash">npx create-next-app@latest hursa
cd hursa
npm run dev
</code></pre>
<p>Make sure to enable Tailwind CSS. The rest of the Next.js options are up to your preference.</p>
<p>Let's start by building the tabs. To save time, I'll use shadcn components.</p>
<pre><code class="language-bash">npx shadcn@latest add tabs button input accordion checkbox dialog
npm install react-icons --save
</code></pre>
<p>Then modify <code>app/page.js</code>:</p>
<pre><code class="language-jsx">&quot;use client&quot;;

import { Tabs, TabsList, TabsTrigger, TabsContent } from &quot;@/components/ui/tabs&quot;;
import { BsPeopleFill, BsBuildingsFill } from &quot;react-icons/bs&quot;;
import { Button } from &quot;@/components/ui/button&quot;;
import PeopleFilter from &quot;@/components/PeopleFilter&quot;;
import { useState } from &quot;react&quot;;

export default function Home() {
  const [peoplePayload, setPeoplePayload] = useState({
    country: &quot;&quot;,
    current_role: &quot;&quot;,
    current_company_name: &quot;&quot;,
  });

  return (
    &lt;div className=&quot;p-8 bg-gray-200 min-h-full&quot;&gt;
      &lt;Tabs defaultValue=&quot;people&quot; className=&quot;max-w-7xl mx-auto relative&quot;&gt;
        &lt;TabsList&gt;
          &lt;TabsTrigger value=&quot;people&quot; className=&quot;flex items-center gap-2 flex-grow-0&quot;&gt;
            &lt;BsPeopleFill /&gt;
            People
          &lt;/TabsTrigger&gt;
          &lt;TabsTrigger value=&quot;company&quot; className=&quot;flex items-center gap-2 flex-grow-0&quot;&gt;
            &lt;BsBuildingsFill /&gt;
            Companies
          &lt;/TabsTrigger&gt;
        &lt;/TabsList&gt;

        &lt;div className=&quot;absolute right-0 top-0 flex gap-6&quot;&gt;
          &lt;Button className=&quot;flex items-center gap-2 bg-blue-600 text-white px-4 rounded-md py-2 disabled:opacity-50 font-semibold&quot;&gt;
            Settings
          &lt;/Button&gt;
          &lt;Button className=&quot;flex items-center gap-2 bg-white text-blue-600 px-4 rounded-md py-2 disabled:opacity-50 font-semibold&quot;&gt;
            Recent Searches
          &lt;/Button&gt;
          &lt;Button className=&quot;flex items-center gap-2 bg-blue-600 text-white px-4 rounded-md py-2 disabled:opacity-50 font-semibold&quot;&gt;
            Export to CSV
          &lt;/Button&gt;
        &lt;/div&gt;

        &lt;TabsContent value=&quot;people&quot; className=&quot;w-full mt-6 min-h-56&quot;&gt;
          &lt;div className=&quot;flex gap-6&quot;&gt;
            &lt;div className=&quot;w-1/4 bg-white rounded-lg p-4&quot;&gt;
              &lt;h3 className=&quot;font-bold&quot;&gt;Filters&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div className=&quot;w-3/4 bg-white rounded-lg p-4&quot;&gt;
              &lt;h3 className=&quot;font-bold&quot;&gt;People profiles results&lt;/h3&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/TabsContent&gt;

        &lt;TabsContent value=&quot;company&quot; className=&quot;w-full mt-6&quot;&gt;
          &lt;div className=&quot;flex gap-6&quot;&gt;
            &lt;div className=&quot;w-1/4 bg-white rounded-lg p-4&quot;&gt;
              &lt;h3 className=&quot;font-bold&quot;&gt;Filters&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div className=&quot;w-3/4 bg-white rounded-lg p-4&quot;&gt;
              &lt;h3 className=&quot;font-bold&quot;&gt;Company profiles results&lt;/h3&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/TabsContent&gt;
      &lt;/Tabs&gt;
    &lt;/div&gt;
  );
}
</code></pre>
<p>You should now be able to see:</p>
<p><img alt="Building the necessary modals of the sales prospecting Lusha clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/filter.png" /></p>
<p>First step down.</p>
<h2 id="build-the-people-filters">Build the people filters</h2>
<p>Instead of building a full Lusha app with all possible filters, for this clone I'm using only these 3 parameters for now:</p>
<ol>
<li><code>country</code>, which we will label as <code>Location</code></li>
<li><code>current_role_title</code>, which we will label as <code>Job title</code></li>
<li><code>current_company_name</code>, which we will label as <code>Current Company</code></li>
</ol>
<p>These are parameters that were available with Proxycurl's Person Search API, which is what the original version of this article used to build the search function for the clone. The old Person Search API had other parameters too, such as <code>linkedin_groups</code>, <code>skills</code>, <code>past_company_name</code> and many more.</p>
<p>If you are implementing this with NinjaPear today, keep the same filters in the UI. The backend mapping changes, not the front end. That is the main thing I want you to preserve from this article.</p>
<h3 id="implement-the-people-filter-component">Implement the people filter component</h3>
<p>To make the filter UI cleaner, we will use an accordion instead of dumping multiple input fields on screen at once.</p>
<p>Create <code>components/PeopleFilter.jsx</code>:</p>
<pre><code class="language-jsx">import React from &quot;react&quot;;
import {
  Accordion,
  AccordionContent,
  AccordionItem,
  AccordionTrigger,
} from &quot;@/components/ui/accordion&quot;;
import { IoMdBriefcase } from &quot;react-icons/io&quot;;
import { FaBuilding } from &quot;react-icons/fa&quot;;
import { IoLocationSharp } from &quot;react-icons/io5&quot;;
import { Button } from &quot;@/components/ui/button&quot;;
import { Input } from &quot;@/components/ui/input&quot;;

const PeopleFilter = ({ payload, setPayload }) =&gt; {
  return (
    &lt;div&gt;
      &lt;h3 className=&quot;font-bold&quot;&gt;Filters&lt;/h3&gt;
      &lt;Accordion type=&quot;single&quot; collapsible&gt;
        &lt;AccordionItem value=&quot;country&quot;&gt;
          &lt;AccordionTrigger className=&quot;flex justify-start gap-2&quot;&gt;
            &lt;IoLocationSharp
              style={{ transform: &quot;rotate(0deg)&quot; }}
              className=&quot;h-5 w-5 text-blue-600 inline-block&quot;
            /&gt;
            &lt;span className=&quot;text-lg font-bold&quot;&gt;Location&lt;/span&gt;
          &lt;/AccordionTrigger&gt;
          &lt;AccordionContent&gt;{/* Autocomplete component here */}&lt;/AccordionContent&gt;
        &lt;/AccordionItem&gt;

        &lt;AccordionItem value=&quot;current-role&quot;&gt;
          &lt;AccordionTrigger className=&quot;flex justify-start gap-2&quot;&gt;
            &lt;IoMdBriefcase
              style={{ transform: &quot;rotate(0deg)&quot; }}
              className=&quot;h-5 w-5 text-blue-600 inline-block&quot;
            /&gt;
            &lt;span className=&quot;text-lg font-bold&quot;&gt;Job Title&lt;/span&gt;
          &lt;/AccordionTrigger&gt;
          &lt;AccordionContent&gt;
            &lt;Input
              type=&quot;text&quot;
              placeholder=&quot;Software Engineer&quot;
              className=&quot;border border-gray-300 rounded-md p-2&quot;
              value={payload.current_role_title}
              onChange={(e) =&gt;
                setPayload({ ...payload, current_role_title: e.target.value })
              }
            /&gt;
          &lt;/AccordionContent&gt;
        &lt;/AccordionItem&gt;

        &lt;AccordionItem value=&quot;current-company&quot;&gt;
          &lt;AccordionTrigger className=&quot;flex justify-start gap-2&quot;&gt;
            &lt;FaBuilding
              style={{ transform: &quot;rotate(0deg)&quot; }}
              className=&quot;h-5 w-5 text-blue-600 inline-block&quot;
            /&gt;
            &lt;span className=&quot;text-lg font-bold&quot;&gt;Current Company&lt;/span&gt;
          &lt;/AccordionTrigger&gt;
          &lt;AccordionContent&gt;
            &lt;Input
              type=&quot;text&quot;
              placeholder=&quot;Current Company&quot;
              className=&quot;border border-gray-300 rounded-md p-2&quot;
              value={payload.current_company_name}
              onChange={(e) =&gt;
                setPayload({ ...payload, current_company_name: e.target.value })
              }
            /&gt;
          &lt;/AccordionContent&gt;
        &lt;/AccordionItem&gt;

        &lt;div className=&quot;flex justify-center&quot;&gt;
          &lt;Button className=&quot;w-full mt-4 bg-blue-600 text-white text-md font-semibold&quot;&gt;
            Apply
          &lt;/Button&gt;
        &lt;/div&gt;
      &lt;/Accordion&gt;
    &lt;/div&gt;
  );
};

export default PeopleFilter;
</code></pre>
<p>And then in <code>app/page.js</code>:</p>
<pre><code class="language-jsx">import PeopleFilter from &quot;@/components/PeopleFilter&quot;;
import { useState } from &quot;react&quot;;

const [peoplePayload, setPeoplePayload] = useState({
  country: &quot;&quot;,
  current_role: &quot;&quot;,
  current_company_name: &quot;&quot;,
});

const [peopleResults, setPeopleResults] = useState([]);

// inside the people tab, replace:
// &lt;h3 className=&quot;font-bold&quot;&gt;Filters&lt;/h3&gt;
// with:
&lt;PeopleFilter payload={peoplePayload} setPayload={setPeoplePayload} /&gt;
</code></pre>
<p>Now you have the filters built:</p>
<p><img alt="Filters built for the Lusha's sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/filter-component-1.png" /></p>
<p>Filters, done.</p>
<h3 id="country-iso-autocomplete-component">Country ISO autocomplete component</h3>
<p>To deliver a better UX, instead of a select element with a long list of countries, we will build a custom autocomplete for the location.</p>
<p>First we need this JSON for the options, <code>lib/countryISO.json</code>:</p>
<pre><code class="language-json">[
  { &quot;value&quot;: &quot;AD&quot;, &quot;label&quot;: &quot;Andorra&quot; },
  { &quot;value&quot;: &quot;AE&quot;, &quot;label&quot;: &quot;United Arab Emirates&quot; },
  { &quot;value&quot;: &quot;AF&quot;, &quot;label&quot;: &quot;Afghanistan&quot; }
]
</code></pre>
<p>The rest of the JSON is available here <a href="https://github.com/nubelaco/use-case-examples/blob/main/people-prospector/lib/countryISO.json?ref=nubela.co">on our GitHub repo</a>.</p>
<p>Create <code>components/Autocomplete.jsx</code>:</p>
<pre><code class="language-jsx">import React, { useState, useRef, useEffect } from &quot;react&quot;;
import options from &quot;../lib/countryISO.json&quot;;
import { Input } from &quot;@/components/ui/input&quot;;

const AutoComplete = ({ setSelectedOption }) =&gt; {
  const [inputValue, setInputValue] = useState(&quot;&quot;);
  const [filteredOptions, setFilteredOptions] = useState([]);
  const dropdownRef = useRef(null);

  const handleChange = (e) =&gt; {
    const value = e.target.value;
    setInputValue(value);
    setFilteredOptions(
      options.filter((option) =&gt;
        option.label.toLowerCase().includes(value.toLowerCase())
      )
    );
  };

  const handleSelect = (option) =&gt; {
    setSelectedOption(option.label);
    setInputValue(option.label);
    setFilteredOptions([]);
  };

  const handleClickOutside = (event) =&gt; {
    if (dropdownRef.current &amp;&amp; !dropdownRef.current.contains(event.target)) {
      setFilteredOptions([]);
    }
  };

  useEffect(() =&gt; {
    document.addEventListener(&quot;mousedown&quot;, handleClickOutside);
    return () =&gt; {
      document.removeEventListener(&quot;mousedown&quot;, handleClickOutside);
    };
  }, []);

  return (
    &lt;div className=&quot;relative&quot; ref={dropdownRef}&gt;
      &lt;Input
        type=&quot;text&quot;
        value={inputValue}
        onChange={handleChange}
        placeholder=&quot;United States&quot;
        className=&quot;border border-gray-300 rounded p-2 w-full mt-6&quot;
      /&gt;
      {filteredOptions.length &gt; 0 &amp;&amp; (
        &lt;ul className=&quot;relative bg-white border border-gray-300 rounded mt-1 w-full z-10 max-h-40 overflow-y-auto&quot;&gt;
          {filteredOptions.map((option, index) =&gt; (
            &lt;li
              key={index}
              onClick={() =&gt; handleSelect(option)}
              className=&quot;p-2 hover:bg-gray-200 cursor-pointer z-50&quot;
            &gt;
              {option.label}
            &lt;/li&gt;
          ))}
        &lt;/ul&gt;
      )}
    &lt;/div&gt;
  );
};

export default AutoComplete;
</code></pre>
<p>And then import it into <code>components/PeopleFilter.jsx</code>:</p>
<pre><code class="language-jsx">import AutoComplete from &quot;./AutoComplete&quot;;

// replace {/* Autocomplete component here */}
&lt;AutoComplete
  setSelectedOption={(value) =&gt; setPayload({ ...payload, country: value })}
/&gt;
</code></pre>
<p>Now there will be a dropdown list of countries relevant to what the user is typing. Much better UX.</p>
<p><img alt="Countries dropdown for the filter of Lusha's sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/autocomplete.png" /></p>
<p>We do not just build things that work. We build things that are nice to use too.</p>
<h2 id="build-the-people-result-component">Build the people result component</h2>
<p>Let's mock the result and call it <code>personSearchMock.json</code> in the <code>lib/</code> directory so we can start building the UI.</p>
<p>You can get it from the sample response in the old Person Search docs or <a href="https://github.com/nubelaco?ref=nubela.co">from our GitHub repo</a>.</p>
<pre><code class="language-jsx">import mockPersonSearch from &quot;@/lib/personSearchMock.json&quot;;

const [peopleResults, setPeopleResults] = useState(mockPersonSearch.results);

// replace:
// &lt;h3 className=&quot;font-bold&quot;&gt;People profiles results&lt;/h3&gt;
// with:
&lt;PeopleResult results={peopleResults} /&gt;
</code></pre>
<p>Now create <code>components/PeopleResult.jsx</code>:</p>
<pre><code class="language-jsx">import React, { useState } from &quot;react&quot;;
import { FaLinkedin } from &quot;react-icons/fa&quot;;
import { IoLocationSharp } from &quot;react-icons/io5&quot;;
import { Checkbox } from &quot;@radix-ui/react-checkbox&quot;;
import Link from &quot;next/link&quot;;
import { Button } from &quot;@/components/ui/button&quot;;
import Modal from &quot;./Modal&quot;;

const PeopleResult = ({ results, selectedPeople, setSelectedPeople }) =&gt; {
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [viewDetails, setViewDetails] = useState(null);

  const handleViewDetails = (person) =&gt; {
    setViewDetails(person);
    setIsModalOpen(true);
  };

  return (
    &lt;div&gt;
      {results.map((person) =&gt; {
        return (
          &lt;div
            key={person.profile.public_identifier}
            className=&quot;flex border-b-2 border-gray-200 py-4&quot;
          &gt;
            &lt;Checkbox
              className=&quot;mr-6 self-center&quot;
              checked={selectedPeople.includes(person)}
              onCheckedChange={(checked) =&gt; {
                if (checked) {
                  setSelectedPeople([...selectedPeople, person]);
                } else {
                  setSelectedPeople(
                    selectedPeople.filter(
                      (p) =&gt;
                        p.profile.public_identifier !==
                        person.profile.public_identifier
                    )
                  );
                }
              }}
            /&gt;

            &lt;div className=&quot;flex flex-col border-r-2 border-gray-200 w-[400px] truncate pr-4&quot;&gt;
              &lt;div className=&quot;flex items-center gap-2 flex-0&quot;&gt;
                &lt;a
                  className=&quot;text-black block text-md font-semibold&quot;
                  href={person.linkedin_profile_url}
                  target=&quot;_blank&quot;
                  rel=&quot;noopener noreferrer&quot;
                &gt;
                  {person.profile.full_name}
                &lt;/a&gt;
                &lt;FaLinkedin className=&quot;text-blue-600&quot; /&gt;
              &lt;/div&gt;

              &lt;p className=&quot;text-sm&quot;&gt;{person.profile.experiences[0].title}&lt;/p&gt;

              &lt;div className=&quot;flex items-center gap-2 mt-2&quot;&gt;
                &lt;IoLocationSharp className=&quot;text-gray-500&quot; /&gt;
                &lt;span className=&quot;text-gray-500 text-sm&quot;&gt;{`${person.profile.city}, ${person.profile.state}, ${person.profile.country}`}&lt;/span&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;div className=&quot;w-[300px] truncate px-4&quot;&gt;
              {person.profile.experiences[0].company_linkedin_profile_url ? (
                &lt;Link
                  href={person.profile.experiences[0].company_linkedin_profile_url}
                  target=&quot;_blank&quot;
                  rel=&quot;noopener noreferrer&quot;
                &gt;
                  &lt;span className=&quot;text-blue-600 text-sm font-semibold&quot;&gt;
                    {person.profile.experiences[0].company}
                  &lt;/span&gt;
                &lt;/Link&gt;
              ) : (
                &lt;span className=&quot;text-sm font-semibold&quot;&gt;
                  {person.profile.experiences[0].company}
                &lt;/span&gt;
              )}

              {person.profile.experiences[0].location ? (
                &lt;span className=&quot;block text-sm text-gray-500&quot;&gt;
                  {person.profile.experiences[0].location}
                &lt;/span&gt;
              ) : null}
            &lt;/div&gt;

            &lt;div className=&quot;ml-auto&quot;&gt;
              &lt;Button
                onClick={() =&gt; handleViewDetails(person)}
                className=&quot;border-2 border-blue-600 bg-white text-blue-600 px-4 py-2 rounded-md hover:text-white&quot;
              &gt;
                View Details
              &lt;/Button&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        );
      })}

      &lt;Modal
        isOpen={isModalOpen}
        setIsOpen={setIsModalOpen}
        viewDetails={viewDetails}
      /&gt;
    &lt;/div&gt;
  );
};

export default PeopleResult;
</code></pre>
<p>Tada. Now you get a person profile in the result modal.</p>
<p><img alt="Results modal for the Lusha sales prospecting clone." src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/result.png" /></p>
<p>The first result now shows.</p>
<p>Next, let's build the modal component that shows experiences and education when the <code>View Details</code> button is clicked.</p>
<p>Create <code>components/Modal.jsx</code>:</p>
<pre><code class="language-jsx">import React from &quot;react&quot;;
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogHeader,
  DialogTitle,
} from &quot;@/components/ui/dialog&quot;;

const Modal = ({ isOpen, setIsOpen, viewDetails }) =&gt; {
  if (!viewDetails) return null;

  return (
    &lt;Dialog open={isOpen} onOpenChange={setIsOpen}&gt;
      &lt;DialogContent className=&quot;max-w-5xl&quot;&gt;
        &lt;DialogTitle&gt;
          &lt;span className=&quot;truncate&quot;&gt;{`${viewDetails.profile.full_name} - ${viewDetails.profile?.headline}`}&lt;/span&gt;
        &lt;/DialogTitle&gt;

        &lt;DialogHeader&gt;
          &lt;DialogDescription&gt;
            &lt;span className=&quot;truncate text-sm&quot;&gt;
              &lt;span&gt;{viewDetails.profile.city &amp;&amp; viewDetails.profile.city}&lt;/span&gt;
              &lt;span&gt;{viewDetails.profile.state &amp;&amp; `, ${viewDetails.profile.state}`}&lt;/span&gt;
              &lt;span&gt;{viewDetails.profile.country &amp;&amp; `, ${viewDetails.profile.country}`}&lt;/span&gt;
            &lt;/span&gt;

            {viewDetails.profile.experiences.length &gt; 0 &amp;&amp; (
              &lt;&gt;
                &lt;h2 className=&quot;text-lg font-bold mt-6 mb-2&quot;&gt;Experiences&lt;/h2&gt;

                &lt;div className=&quot;flex flex-col gap-2&quot;&gt;
                  {viewDetails.profile.experiences.map((experience, index) =&gt; (
                    &lt;div key={`${experience.title}-${index}`}&gt;
                      &lt;span className=&quot;block text-sm text-gray-600 font-semibold&quot;&gt;{`${experience.title} at ${experience.company}`}&lt;/span&gt;
                      &lt;span className=&quot;block text-sm text-gray-500&quot;&gt;
                        {experience.starts_at?.day &amp;&amp;
                          `${experience.starts_at.day}/${experience.starts_at.month}/${experience.starts_at.year} - `}

                        {experience.ends_at?.day
                          ? `${experience.ends_at.day}/${experience.ends_at.month}/${experience.ends_at.year}`
                          : &quot;Present&quot;}
                      &lt;/span&gt;
                    &lt;/div&gt;
                  ))}
                &lt;/div&gt;
              &lt;/&gt;
            )}

            {viewDetails.profile.education.length &gt; 0 &amp;&amp; (
              &lt;&gt;
                &lt;h2 className=&quot;text-lg font-bold mt-6 mb-2&quot;&gt;Education&lt;/h2&gt;
                &lt;div className=&quot;flex flex-col gap-2&quot;&gt;
                  {viewDetails.profile.education.map((education, index) =&gt; (
                    &lt;div key={`${education.degree_name}-${index}`}&gt;
                      &lt;span className=&quot;block text-sm text-gray-600 font-semibold&quot;&gt;{`${education.degree_name} in ${education.field_of_study} at ${education.school}`}&lt;/span&gt;
                      &lt;span className=&quot;block text-sm text-gray-500&quot;&gt;
                        {education.starts_at?.day &amp;&amp;
                          `${education.starts_at.day}/${education.starts_at.month}/${education.starts_at.year} - `}

                        {education.ends_at?.day
                          ? `${education.ends_at.day}/${education.ends_at.month}/${education.ends_at.year}`
                          : &quot;Present&quot;}
                      &lt;/span&gt;
                    &lt;/div&gt;
                  ))}
                &lt;/div&gt;
              &lt;/&gt;
            )}
          &lt;/DialogDescription&gt;
        &lt;/DialogHeader&gt;
      &lt;/DialogContent&gt;
    &lt;/Dialog&gt;
  );
};

export default Modal;
</code></pre>
<p>This is the result with experiences and education shown:</p>
<p><img alt="Full results with experiences and education for the Lusha sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/modal.png" /></p>
<p>Full results, with experiences and education.</p>
<p>Now to prepare for fetching data from Proxycurl's API, let's create a loader while we wait for the response.</p>
<p>Create <code>components/Loader.jsx</code>:</p>
<pre><code class="language-jsx">import React from &quot;react&quot;;

const Loader = () =&gt; {
  return (
    &lt;div className=&quot;flex flex-col justify-center items-center h-screen&quot;&gt;
      &lt;div className=&quot;animate-spin rounded-full h-32 w-32 border-t-4 border-b-4 border-blue-600&quot;&gt;&lt;/div&gt;
      &lt;div className=&quot;text-2xl font-bold mt-6&quot;&gt;Loading...&lt;/div&gt;
    &lt;/div&gt;
  );
};

export default Loader;
</code></pre>
<p>And then modify <code>app/page.js</code>:</p>
<pre><code class="language-jsx">const [isLoading, setIsLoading] = useState(true);

&lt;div className=&quot;w-3/4 bg-white rounded-lg p-4&quot;&gt;
  {isLoading &amp;&amp; &lt;Loader /&gt;}
  {!isLoading &amp;&amp; (
    &lt;&gt;
      &lt;h3 className=&quot;font-bold&quot;&gt;People profiles results&lt;/h3&gt;
      &lt;PeopleResult
        results={peopleResults}
        selectedPeople={selectedPeople}
        setSelectedPeople={setSelectedPeople}
      /&gt;
    &lt;/&gt;
  )}
&lt;/div&gt;
</code></pre>
<p>Now you get the spinner while results load:</p>
<p><img alt="Loader for the Lusha sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/loader.gif" /></p>
<p>Another nice UX touch.</p>
<h2 id="input-the-api-key">Input the API key</h2>
<p>In the clone, I built a way for you to input your Proxycurl API key for the clone to work, the <code>Settings</code> button on top. In your own application meant for end users, feel free to remove this part if your users do not need to input any API key.</p>
<p>Create <code>components/SettingsModal.jsx</code>:</p>
<pre><code class="language-jsx">import React from &quot;react&quot;;
import { Dialog, DialogContent, DialogTitle } from &quot;@/components/ui/dialog&quot;;
import { Input } from &quot;@/components/ui/input&quot;;
import { Button } from &quot;@/components/ui/button&quot;;

const SettingsModal = ({
  isSettingsOpen,
  setSettingsOpen,
  apiKey,
  setApiKey,
}) =&gt; {
  const handleSaveApiKey = () =&gt; {
    localStorage.setItem(&quot;apiKey&quot;, apiKey);
    setSettingsOpen(false);
  };

  return (
    &lt;Dialog open={isSettingsOpen} onOpenChange={setSettingsOpen}&gt;
      &lt;DialogContent&gt;
        &lt;DialogTitle&gt;Settings&lt;/DialogTitle&gt;
        &lt;h1&gt;Add your API key&lt;/h1&gt;
        &lt;Input
          type=&quot;text&quot;
          placeholder=&quot;API key&quot;
          value={apiKey}
          onChange={(e) =&gt; setApiKey(e.target.value)}
        /&gt;
        &lt;Button className=&quot;w-min mt-4&quot; onClick={handleSaveApiKey}&gt;
          Save
        &lt;/Button&gt;
      &lt;/DialogContent&gt;
    &lt;/Dialog&gt;
  );
};

export default SettingsModal;
</code></pre>
<p>And modify <code>app/page.js</code>:</p>
<pre><code class="language-jsx">const [apiKey, setApiKey] = useState(null);
const [isSettingsOpen, setIsSettingsOpen] = useState(false);

useEffect(() =&gt; {
  const savedApiKey = localStorage.getItem(&quot;apiKey&quot;);
  if (savedApiKey) {
    setApiKey(savedApiKey);
  }
}, []);

&lt;/Tabs&gt;
&lt;SettingsModal
  isSettingsOpen={isSettingsOpen}
  setSettingsOpen={setIsSettingsOpen}
  apiKey={apiKey}
  setApiKey={setApiKey}
/&gt;
&lt;/div&gt;
</code></pre>
<p>Now you can add your API key.</p>
<p>If you are adapting this for NinjaPear instead, store your NinjaPear API key the exact same way. No need to change the UX just because the backend changed.</p>
<p><img alt="Proxycurl API input modal for the Lusha sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/input-api-key.gif" /></p>
<p>Simply input your API key to get the data needed for the app.</p>
<h2 id="make-the-live-api-call">Make the live API call</h2>
<p>Modify <code>components/PeopleFilter.jsx</code>:</p>
<pre><code class="language-jsx">import { useState } from &quot;react&quot;;
import countryISO from &quot;@/lib/countryISO.json&quot;;

const PeopleFilter = ({ setIsLoading, setPeopleResults, apiKey }) =&gt; {
  const [error, setError] = useState([]);
  const [payload, setPayload] = useState({
    country: &quot;&quot;,
    current_role: &quot;&quot;,
    current_company_name: &quot;&quot;,
  });

  const handleSearch = async () =&gt; {
    setError([]);
    let hasError = false;

    if (payload.country === &quot;&quot;) {
      setError((prev) =&gt; [...prev, &quot;Country is required&quot;]);
      hasError = true;
    }

    if (!apiKey) {
      setError((prev) =&gt; [...prev, &quot;Please enter your API key in the settings&quot;]);
      hasError = true;
    }

    if (hasError) return;

    try {
      setIsLoading(true);

      const params = new URLSearchParams({
        country: countryISO.find((country) =&gt; country.label === payload.country).value,
        page_size: 10,
        enrich_profiles: &quot;enrich&quot;,
      });

      if (payload.current_role) {
        params.append(&quot;current_role_title&quot;, payload.current_role);
      }

      if (payload.current_company_name) {
        params.append(&quot;current_company_name&quot;, payload.current_company_name);
      }

      const response = await fetch(`/api/peopleSearch?${params.toString()}`, {
        method: &quot;GET&quot;,
        headers: {
          Authorization: `Bearer ${apiKey}`,
        },
      });

      const data = await response.json();
      setPeopleResults(data.results);
    } catch (error) {
      console.log(error, &quot;error&quot;);
    }

    setIsLoading(false);
  };

  return (
    &lt;&gt;
      {/* your existing filter JSX */}
      {error &amp;&amp;
        error.map((err) =&gt; (
          &lt;p className=&quot;text-red-500 text-sm font-semibold text-center mt-2&quot; key={err}&gt;
            {err}
          &lt;/p&gt;
        ))}
    &lt;/&gt;
  );
};
</code></pre>
<p>Now when users search with an empty API key or location, they get a clear error state.</p>
<p><img alt="Error message from no input on the Lusha sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/error.png" /></p>
<p>Next, let's handle the empty state in <code>components/PeopleResult.jsx</code>:</p>
<pre><code class="language-jsx">&lt;div&gt;
  {!isLoading &amp;&amp; results.length === 0 &amp;&amp; (
    &lt;div&gt;
      &lt;span className=&quot;flex items-center gap-4 w-full justify-center mt-24&quot;&gt;
        &lt;FaArrowLeft className=&quot;text-5xl&quot; /&gt;
        &lt;span className=&quot;text-3xl font-semibold&quot;&gt;Find your prospects here&lt;/span&gt;
      &lt;/span&gt;
    &lt;/div&gt;
  )}
&lt;/div&gt;
</code></pre>
<p>You get this view before any input is submitted:</p>
<p><img alt="This is empty state view of the Lusha sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/empty-state--1-.png" /></p>
<p>Lastly, we need a Next.js API route to make the API call.</p>
<p>Create <code>app/api/peopleSearch/route.js</code>:</p>
<pre><code class="language-js">import { NextResponse } from &quot;next/server&quot;;

export async function GET(request) {
  const params = request.url.split(&quot;?&quot;)[1];

  try {
    const response = await fetch(
      `https://nubela.co/proxycurl/api/v2/search/person?${params}`,
      {
        headers: {
          Authorization: request.headers.get(&quot;Authorization&quot;),
        },
      }
    );

    const data = await response.json();
    return NextResponse.json(data);
  } catch (error) {
    console.log(error);
    return NextResponse.json({ error });
  }
}
</code></pre>
<p>And there you go, you've successfully created this little monster, which is the Lusha sales prospecting clone.</p>
<p><img alt="The completed Lusha sales prospecting clone" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/10/final.gif" /></p>
<p>Voila. Try it yourself.</p>
<h2 id="ninjapear-adaptation-notes">NinjaPear adaptation notes</h2>
<p>This is the part I would actually pay attention to if I were building this today.</p>
<p>Proxycurl is sunset. So if you copy the UI and then wire it to the old endpoint above, you are learning from history, not building for production.</p>
<p>What stays the same:</p>
<ul>
<li>The filter UX</li>
<li>The local storage pattern for API key and recent searches</li>
<li>The result list layout</li>
<li>The details modal</li>
<li>The CSV export flow</li>
<li>The server-side proxy route inside Next.js</li>
</ul>
<p>What changes with NinjaPear:</p>
<ul>
<li>Use NinjaPear's <strong>Employee API</strong> as the profile enrichment source</li>
<li>Use NinjaPear's <strong>Company API</strong> when you need company details to support the company column or company-side filtering</li>
<li>If you want the finished workflow instead of building the whole thing, use <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>, which is basically a spreadsheet with superpowers for prospect generation, customer expansion and work email enrichment</li>
</ul>
<p>In other words, the architecture is still valid:</p>
<ol>
<li>Collect filter inputs on the client</li>
<li>Send them to your own Next.js API route</li>
<li>Call the upstream data API from the server</li>
<li>Normalize the response into a stable <code>results[]</code> shape</li>
<li>Render the list and modal off your own shape, not the vendor's raw JSON</li>
</ol>
<p>That last point matters. A lot. If I were rebuilding this from scratch, I would add a <code>mapNinjaPearPersonToUI()</code> function and keep every component ignorant of the upstream provider.</p>
<p>Something like this:</p>
<pre><code class="language-ts">export function mapNinjaPearPersonToUI(person: any) {
  return {
    id: person.id,
    linkedin_profile_url: person.linkedin_profile_url || null,
    profile: {
      full_name: person.full_name,
      headline: person.bio || person.role || null,
      city: person.city || null,
      state: person.state || null,
      country: person.country || null,
      experiences: (person.work_experience || []).map((job: any) =&gt; ({
        title: job.role,
        company: job.company_name,
        company_linkedin_profile_url: null,
        location: null,
        starts_at: job.start_date || null,
        ends_at: job.end_date || null,
      })),
      education: (person.education || []).map((edu: any) =&gt; ({
        degree_name: edu.major,
        field_of_study: edu.major,
        school: edu.school,
        starts_at: edu.start_date || null,
        ends_at: edu.end_date || null,
      })),
    },
  };
}
</code></pre>
<p>Not perfect. Good enough. More importantly, it decouples your UI from the data vendor.</p>
<p>Here is a cleaner server route for the NinjaPear path:</p>
<pre><code class="language-ts">import { NextRequest, NextResponse } from &quot;next/server&quot;;

export async function POST(request: NextRequest) {
  const { personName, employerWebsite, role } = await request.json();

  const response = await fetch(&quot;https://nubela.co/api/v1/employee/profile&quot;, {
    method: &quot;GET&quot;,
    headers: {
      Authorization: `Bearer ${process.env.NINJAPEAR_API_KEY}`,
    },
  });

  const person = await response.json();

  return NextResponse.json({
    results: [mapNinjaPearPersonToUI(person)],
  });
}
</code></pre>
<p>That snippet is intentionally simple. In a real build, I would validate inputs, branch between <code>name + company</code> and <code>role + company</code>, and cache successful lookups for a few minutes.</p>
<p>A good reminder from X: the data underneath your shiny UI matters more than the shiny UI.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Your sales team does not need another AI SDR.

It needs a CRM janitor.

Most B2B teams are trying to automate prospecting before they fix the mess already inside HubSpot.

Bad idea.

Dirty CRM data kills every “AI agent” you build on top of it.</p>&mdash; Jet (@jettonext) <a href="https://x.com/jettonext/status/2056360294155509846?ref=nubela.co">Mon May 18 13:04:34 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="github-project">GitHub project</h2>
<p>The original full code is still here: <a href="https://github.com/nubelaco/use-case-examples/tree/main/people-prospector?ref=nubela.co">the full code on our GitHub repo</a>.</p>
<p>I also need to be straight with you about the NinjaPear repo request. I could not verify an official public GitHub project from Nubela that already replicates this exact Lusha clone on NinjaPear. I am not going to fake a repo link just to make the article look complete.</p>
<p>So the honest version is this:</p>
<ul>
<li><strong>Verified today:</strong> the original Proxycurl clone repo exists</li>
<li><strong>Not verified today:</strong> an official public NinjaPear-specific clone repo for this exact tutorial</li>
<li><strong>What I would do instead:</strong> fork the original repo, replace the upstream API layer first, add a vendor-normalization function, and keep the UI untouched</li>
</ul>
<p>If an official NinjaPear-specific clone repo is published under the Nubela GitHub later, I would use that instead of the sunset Proxycurl version.</p>
<h2 id="if-i-rebuilt-this-today">If I rebuilt this today</h2>
<p>I would make three changes immediately:</p>
<ol>
<li>Replace the old search endpoint with a provider abstraction</li>
<li>Normalize all person data into one UI shape before rendering</li>
<li>Keep the CSV export and recent searches entirely vendor-agnostic</li>
</ol>
<p>That architecture lets you swap old Proxycurl, current NinjaPear, or even a totally different upstream later without rewriting the app.</p>
<p>And yes, this is where products like <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> become useful. If you want the outcome, a spreadsheet of target accounts and people, faster than hand-building the whole UI, that is the shortcut. If you want the learning, keep building the clone yourself.</p>
<h2 id="proxycurl-powered-many-applications-like-this">Proxycurl powered many applications like this</h2>
<p>Congratulations, you made it to the end.</p>
<p>This is your reward as promised: <a href="https://github.com/nubelaco/use-case-examples/tree/main/people-prospector?ref=nubela.co">the full code on our GitHub repo</a>.</p>
<p>And the link to <a href="https://lusha-clone-by-procxycurl.vercel.app/?ref=nubela.co">the clone that I built</a> again.</p>
<p>At Proxycurl, we had a full suite of API products and LinkDB, a database of close to 500 million public LinkedIn profiles, that powered many use cases. HR recruitment, sales prospecting, marketing growth, investment prospecting and more. It did a lot of heavy lifting for our customers.</p>
<p>Today, the continuation of that work is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, with products like <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>, the Employee API, Company API, Customer API and Monitor API. Same obsession with useful B2B data. Better product direction.</p>
<p>We are still developer-first. That part did not change. I still care about the same thing I cared about when I built Proxycurl: helping you get from data source to working product fast, without configuration hell.</p>
<p>If you are building this clone for real, keep the UI from this article, keep the local storage ideas, and swap the upstream into NinjaPear before you ship it. That is the practical next step.</p>
<p>Have fun building, and reach out to us <a href="mailto:hello@nubela.co">via email</a> or live chat if you have any questions.</p>
<blockquote>
<p>We recently launched a writing program for our developer community. If you're interested to write technical pieces for us, reach out to us at <a href="mailto:marketing@nubela.co">marketing@nubela.co</a>. We'll be glad to get in touch.</p>
</blockquote>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How CoffeeSpace Powers Its Tinder-Like Cofounder Matching App with Proxycurl ]]></title>
        <description><![CDATA[ We at Proxycurl have had the privilege of speaking with Hazim, the CEO and co-founder of CoffeeSpace, a Tinder/Hinge-like platform for co-founder matching.


Intrigued? We’re here to tell you all about it: its origins, core idea and features, challenges faced, and the tech stack that powers its data-matching ]]></description>
        <link>https://nubela.co/blog/coffeespace-powers-its-cofounder-matching-app-with-proxycurl/</link>
        <guid isPermaLink="false">66f65aa45ad68b0001185e8f</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Tue, 01 Oct 2024 14:52:18 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_407.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>We at Proxycurl have had the privilege of speaking with Hazim, the CEO and co-founder of <a href="https://www.coffeespace.com/?ref=nubela.co">CoffeeSpace</a>, a Tinder/Hinge-like platform for co-founder matching.</p>
<p>Intrigued? We’re here to tell you all about it: its origins, core idea and features, challenges faced, and the tech stack that powers its data-matching algorithm.</p>
<p>The space that CoffeeSpace is delving into is a relatively new and innovatively-disruptive space, insofar that they earned a spot in TechCrunch Disrupt 2024’s <a href="https://techcrunch.com/events/tc-disrupt-2024/startup-battlefield/?ref=nubela.co">Startup Battlefield 200</a>, a premier startup competition by TechCrunch.</p>
<p>Here’s CoffeeSpace’s elevator pitch: Similar to dating apps, users/co-founders can swipe left or right through profiles on the platform. A match occurs when two co-founders swipe right on each other. They can then start chatting and connecting.</p>
<p>Watch the full interview here:</p>
<p>Still intrigued? Keep reading.</p>
<h2 id="this-was-how-coffeespace-started">This was how CoffeeSpace started</h2>
<p>Hazim was a finance graduate from MIT with experience in prominent financial roles like the World Bank, yet he always had a passion for startups and innovation.</p>
<p>During the peak of the Covid pandemic, <a href="https://www.linkedin.com/in/hazimmohamad/?ref=nubela.co">Hazim</a>, like all of us, found himself with a sudden availability of ample time at home. It was during the same period that he met <a href="https://www.linkedin.com/in/carin-gan/?ref=nubela.co">Carin</a>, now the co-founder and CTO of CoffeeSpace. They had countless hours and days of brainstorming and realized there was a significant gap in the co-founder matching space, stemming from their own challenges in finding compatible co-founder partners.</p>
<p>And so, CoffeeSpace was born.</p>
<h2 id="coffeespaces-core-idea-and-features">CoffeeSpace’s core idea and features</h2>
<p>CoffeeSpace stands out as a disruptive and innovative solution to this notorious and “age-old” struggle within the startup scene of finding co-founders. Traditionally, co-founder matching often involves organizing meetups, or tapping on a community’s existing network such as <a href="https://www.ycombinator.com/cofounder-matching?ref=nubela.co">Y Combinator’s own co‑founder matching network</a>. These meetings are however not easily discoverable, necessitate in-person meet-ups limited to certain cities, and are not scalable.</p>
<p>This is exactly the gap that CoffeeSpace strives to solve.</p>
<p>CoffeeSpace drew major inspiration from popular dating apps like Tinder and Hinge and deployed the familiar "swipe right" feature and algorithms to match users to potential co-founders. They aim to streamline the entire process of finding and connecting with potential co-founders onto a single app platform.</p>
<p>Users can download the app for free. Upon creating a new account, users are prompted to complete a series of quick questionnaires that help the algorithm construct the users’ co-founder profile. This profile will then be displayed and used to match with other users/co-founders.</p>
<p>Here are some snapshots of the questionnaire interface:</p>
<p><img alt="CoffeeSpace onboarding questionnaire" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/09/CoffeeSpace-onboarding-questionnaire.png" /></p>
<p>Users are greeted with this questionnaire during onboarding, which builds their CoffeeSpace profiles</p>
<h2 id="how-does-proxycurl-power-coffeespace-behind-the-scenes">How does Proxycurl power CoffeeSpace behind the scenes?</h2>
<p><a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> is a full-fledged data enrichment API provider, where developers can pull data at scale about people, companies, contact info, jobs, and more. Our APIs and <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">dataset products</a> power many such applications like CoffeeSpace.</p>
<blockquote>
<p><strong>Note:</strong> Proxycurl has since been sunset. The founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, a B2B data platform focused on competitive intelligence, company data, people enrichment, and monitoring company changes. We are retaining the original references to Proxycurl in this case study because that was the product CoffeeSpace was using at the time of the interview.</p>
</blockquote>
<p>In the series of screenshots shared above, the very first question that CoffeeSpace asks of users during onboarding is their LinkedIn profile URL. CoffeeSpace then uses <a href="https://nubela.co/proxycurl/people-api?ref=nubela.co">Proxycurl’s Person Profile Endpoint</a> to enrich the users’ profiles with their educational backgrounds and work experiences automatically. These all happen behind the scenes automatically and at scale for all users during onboarding.</p>
<p>Using Bill Gates as an example. Say he’s looking for a co-founder, he proceeded to download CoffeeSpace and register for an account, this is likely CoffeeSpace’s code input that pulls Bill Gates’ enriched data programmatically via Proxycurl’s People API.</p>
<pre><code class="language-python">import requests

api_key = 'YOUR_API_KEY'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/v2/linkedin'
params = {
    'linkedin_profile_url': 'https://www.linkedin.com/in/williamhgates/',
    'extra': 'include',
    'github_profile_id': 'include',
    'facebook_profile_id': 'include',
    'twitter_profile_id': 'include',
    'personal_contact_number': 'include',
    'personal_email': 'include',
    'inferred_salary': 'include',
    'skills': 'include',
    'use_cache': 'if-present',
    'fallback_to_cache': 'on-error',
}
response = requests.get(api_endpoint,
                        params=params,
                        headers=headers)
</code></pre>
<p>The above code includes other parameters that aren’t directly related to CoffeeSpace’s use case, but it shows the various parameters that can be used with Proxycurl’s Person Profile Endpoint.</p>
<p>And this is the response, specific to CoffeeSpace’s use case, the users’ LinkedIn profile picture, education background and work experience:</p>
<pre><code class="language-json">{
    &quot;public_identifier&quot;: &quot;williamhgates&quot;,
    &quot;profile_pic_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/person/williamhgates/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=0004d7f56a0400b0000000001%2F20240927%2Fus-west-000%2Fs3%2Faws4_request&amp;X-Amz-Date=20240927T050405Z&amp;X-Amz-Expires=3600&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=f3959b437dc80e9281bb864bbad28f53312565ab1cd7776bfd6e8e17cea4dc90&quot;,
    &quot;experiences&quot;: [
        {
            &quot;starts_at&quot;: {
                &quot;day&quot;: 1,
                &quot;month&quot;: 1,
                &quot;year&quot;: 2000
            },
            &quot;ends_at&quot;: null,
            &quot;company&quot;: &quot;Bill &amp; Melinda Gates Foundation&quot;,
            &quot;company_linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/bill-&amp;-melinda-gates-foundation&quot;,
            &quot;company_facebook_profile_url&quot;: null,
            &quot;title&quot;: &quot;Co-chair&quot;,
            &quot;description&quot;: null,
            &quot;location&quot;: null,
            &quot;logo_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/bill-%26-melinda-gates-foundation/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=0004d7f56a0400b0000000001%2F20240927%2Fus-west-000%2Fs3%2Faws4_request&amp;X-Amz-Date=20240927T050405Z&amp;X-Amz-Expires=1800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=77937a411477b30790ce699266efabd2cca85edea619f2af747cb5e0f9697884&quot;
        },
        {
            &quot;starts_at&quot;: {
                &quot;day&quot;: 1,
                &quot;month&quot;: 1,
                &quot;year&quot;: 2015
            },
            &quot;ends_at&quot;: null,
            &quot;company&quot;: &quot;Breakthrough Energy &quot;,
            &quot;company_linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/breakthrough-energy&quot;,
            &quot;company_facebook_profile_url&quot;: null,
            &quot;title&quot;: &quot;Founder&quot;,
            &quot;description&quot;: null,
            &quot;location&quot;: null,
            &quot;logo_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/breakthrough-energy/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=0004d7f56a0400b0000000001%2F20240927%2Fus-west-000%2Fs3%2Faws4_request&amp;X-Amz-Date=20240927T050405Z&amp;X-Amz-Expires=1800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=92e52762e76f15b03c35704c35a74b9667c06be40019789485423b169d7a9724&quot;
        },
        {
            &quot;starts_at&quot;: {
                &quot;day&quot;: 1,
                &quot;month&quot;: 1,
                &quot;year&quot;: 1975
            },
            &quot;ends_at&quot;: null,
            &quot;company&quot;: &quot;Microsoft&quot;,
            &quot;company_linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/microsoft&quot;,
            &quot;company_facebook_profile_url&quot;: null,
            &quot;title&quot;: &quot;Co-founder&quot;,
            &quot;description&quot;: null,
            &quot;location&quot;: null,
            &quot;logo_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/microsoft/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=0004d7f56a0400b0000000001%2F20240927%2Fus-west-000%2Fs3%2Faws4_request&amp;X-Amz-Date=20240927T050405Z&amp;X-Amz-Expires=1800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=6436aebfa6d4e4aaf00ca41d011ff9011e0985006c5697015617cf4d1ded37ad&quot;
        }
    ],
    &quot;education&quot;: [
        {
            &quot;starts_at&quot;: {
                &quot;day&quot;: 1,
                &quot;month&quot;: 1,
                &quot;year&quot;: 1973
            },
            &quot;ends_at&quot;: {
                &quot;day&quot;: 31,
                &quot;month&quot;: 12,
                &quot;year&quot;: 1975
            },
            &quot;field_of_study&quot;: null,
            &quot;degree_name&quot;: null,
            &quot;school&quot;: &quot;Harvard University&quot;,
            &quot;school_linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/1646/&quot;,
            &quot;school_facebook_profile_url&quot;: null,
            &quot;description&quot;: null,
            &quot;logo_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/harvard-university/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=0004d7f56a0400b0000000001%2F20240927%2Fus-west-000%2Fs3%2Faws4_request&amp;X-Amz-Date=20240927T050405Z&amp;X-Amz-Expires=1800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=f364c50c234e9eb9f06a39c3c92a6a5331ca30096f57f405da5472ce3bf39894&quot;,
            &quot;grade&quot;: null,
            &quot;activities_and_societies&quot;: null
        },
        {
            &quot;starts_at&quot;: null,
            &quot;ends_at&quot;: null,
            &quot;field_of_study&quot;: null,
            &quot;degree_name&quot;: null,
            &quot;school&quot;: &quot;Lakeside School&quot;,
            &quot;school_linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/30288/&quot;,
            &quot;school_facebook_profile_url&quot;: null,
            &quot;description&quot;: null,
            &quot;logo_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/lakeside-school/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=0004d7f56a0400b0000000001%2F20240927%2Fus-west-000%2Fs3%2Faws4_request&amp;X-Amz-Date=20240927T050405Z&amp;X-Amz-Expires=1800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=4ef24eca69fdada887d5faa63ceb5606718be833439c930e75d8813638f7f157&quot;,
            &quot;grade&quot;: null,
            &quot;activities_and_societies&quot;: null
        }
    ]
}
</code></pre>
<p>The data retrieved using the Person Profile Endpoint also plays a key role in providing CoffeeSpace with insights into their most prevalent co-founder demographics, informing them about their ideal customer profiles (ICPs) and more, quoting Hazim,</p>
<blockquote>
<p>Stanford is our number one user pool by school.</p>
</blockquote>
<p>With this information, they know better who their key ICPs are.</p>
<p>In addition to front-end features, Hazim leverages <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">Proxycurl’s Person Profile Endpoint</a> to access data about new users for background verification purposes. This proves especially useful when users provide incomplete information or when their LinkedIn profiles are missing crucial details. In such cases, he retrieves users' data from alternative sources using Proxycurl's API endpoint.</p>
<h2 id="what-if-users-uninstall-the-app-after-a-successful-match">What if users uninstall the app after a successful match?</h2>
<p>During the interview, a pressing question was on our minds: Will most users uninstall the app after a successful match? We were glad Hazim gave us a great response to this question.</p>
<p>The short answer is, no. This is because CoffeeSpace’s use case extends beyond just co-founder matching. It also caters to early-stage hiring and networking within the startup scenes as founders continue to find the need to seek talents for their companies.</p>
<p>Even if a successful match is made, co-founders may find that they are not compatible in real life and may need to search for another like-minded partner, again using CoffeeSpace.</p>
<p>Some statistics:</p>
<ul>
<li>The average lifespan of a startup is typically 6-12 months, indicating that users may return to CoffeeSpace to find new co-founders for other ideas.</li>
<li>Early-stage hiring is crucial to the survival of startups <a href="https://rdcu.be/dVfEW?ref=nubela.co">(citation)</a>, indicating matched co-founders might still use CoffeeSpace to find talents</li>
</ul>
<p>In short, users do stick around even after successful co-founder matching.</p>
<h2 id="thats-exciting-whats-next-for-coffeespaces-future">That’s exciting. What’s next for CoffeeSpace’s future?</h2>
<h3 id="improving-the-cofounder-matching-algorithm">Improving the cofounder matching algorithm</h3>
<p>CoffeeSpace’s superpower lies in its matching algorithm, and that remained the top priority in their product roadmap, to continually improve the algorithm.</p>
<p>One strategy involves leveraging LLM solutions like OpenAI to enhance semantic understanding. This includes interpreting user input, preferences, and enriched profile data to better grasp user personas and enhance matching accuracy.</p>
<p>Besides drawing inspiration from popular dating apps like Tinder and Hinge, CoffeeSpace is also getting inspiration from major social networking sites like TikTok on how to improve its algorithm. Improvements involving tracking various users’ behaviors such as profile views, time spent on profiles, and scrolling habits.</p>
<p>Beyond person data, CoffeeSpace could also pull company data related to their users to enhance that part of their algorithm relating to the users’ professional backgrounds. For instance, with <a href="https://nubela.co/proxycurl/company-api?ref=nubela.co">Proxycurl’s Company API</a>, a plethora of additional data points such as a company’s funding history, acquisition information, company size, and more can be pulled to improve user matching.</p>
<h3 id="expanding-into-the-vc-and-startup-investment-matching-space">Expanding into the VC and startup investment matching space</h3>
<p>CoffeeSpace has already been attracting interest from investment firms and venture capitalists due to the valuable data insights it possesses on its extensive user base of <em>really</em>-early stage co-founders.</p>
<p>It is common for investment companies to rely on <a href="https://nubela.co/proxycurl/solutions/alternative-data-for-investment-firms?ref=nubela.co">investment signals</a> such as tracking the movements of potential startup founders to identify investment prospects. However, investors will know of this information only after a founder founded a startup and updated his/her social profiles. In some cases like stealth startups, they won’t even know.</p>
<p>Through CoffeeSpace however, VCs can tap into the huge reservoir of potential startup founders even <strong><em>before</em></strong> they start a company, even as early as when they’re exploring ideas or finding a co-founder on CoffeeSpace’s platform.</p>
<h2 id="to-better-algorithm-data-and-co-founder-matching">To better algorithm, data, and co-founder matching</h2>
<p>We are stoked to be part of CoffeeSpace’s remarkable growth. Launched in March 2024, CoffeeSpace now has a whooping 5600 users (and growing) and secured $500k in funding.</p>
<p>Similar to the evolution seen in the dating app industry, there initially was a lot of stigma around such tech and algorithms in matching people for love, and now for starting a company. The skepticism was that it’s just odd for tech to connect people for such an intimate and complex endeavor as love, or in this case the startup journey. Over time though, dating apps have become the norm. We believe it’ll happen for the work that CoffeeSpace is doing here too.</p>
<p>💡</p>
<p>Looking for a solution to pull person and company data programmatically at scale? Explore the suite of <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> products and APIs built by the founder behind Proxycurl.</p>
<p>• B2B data no one else has, all on 1 platform<br />
• Competitive intelligence, company data, people enrichment, and monitoring<br />
• Pay-as-you-go pricing, no monthly minimums<br />
• 3-day free trial with 10 credits included<br />
• Built for developers, operators, and GTM teams  </p>
<p><a href="https://nubela.co/?ref=nubela.co">Get started with NinjaPear</a> ➡️</p>
<hr />
<h3 id="coffeespace-interview-transcipt">CoffeeSpace Interview Transcipt</h3>
<p><strong>Colton:</strong> Hi I'm Colton here with Proxycurl. Normally you would find me over on the blog but today you'll find me either on the blog or on YouTube. And I'm here with Hazim, the founder of CoffeeSpace. So I'm going to go ahead and let him introduce himself.</p>
<p><strong>Hazim:</strong> So I'm Hazim, co-founder CEO of CoffeeSpace. We're building the Tinder for people exploring ideas to find co-founders essentially, that's the easiest way to explain it.</p>
<p>Short background about myself. I'm from Malaysia, born and raised. Went to the UK for my undergrad. Came to the US about 8 years ago, slightly more than 8 years now. I came from my grad school, I was in MIT, I was doing the Masters of Financial Engineering, the MFin program over there. Went to the World Bank for about 5 years. I was in DC, much colder weather than it is in SF. So I move from the worst weather of Boston to like, yeah, that has been the gradual shift. I was with the World Bank for 5 years I was doing basically quantitative risk for the treasury portfolio management. So my team managed basically the risk of like a 45 billion portfolios. Which is completely different than what CoffeeSpace is of course.</p>
<p>What led me to CoffeeSpace was Covid actually. Because of Covid many of the things, you know, the social elements of work was not there. I have a bit more time now working from home in DC and let's explore some ideas. So I posted about a problem space, CoffeeSpace was not the first iteration of the idea explored actually. I posted about the problem space I was passionate about on Facebook, LinkedIn. My co-founder Carin reached out, we did not know each other, and this ties up to why we believe CoffeeSpace is so important. Because I thought about an idea for two years, didn't do anything about it, till Karin reached out. She was a stranger, we met at a random event years before that never kept in touch but because of this article we connected. We explored things over weekends. When you don't go to school together have work together you need to build that foundation of a relationship of trust, that working relationship. So what we did was, she was at Facebook at the time. We explored things over weekends, we had a call every Sunday night, two three hours. We'll talk about the things we want to learn, read, watch or explore, validate over the next week, and that was what was for months. We didn't know we wanted to do a start up full time, we were perfectly happy with our jobs. But yeah you explore something enough and it gets somewhere.</p>
<p><strong>Colton:</strong> What was your primary role in CoffeeSpace in comparison to like how your partner complimented your role as well.</p>
<p><strong>Hazim:</strong> So we, in terms of interest, personality we couldn't be further apart, and that is why it's so perfect right. We cover absolutely, I mean, we compliment each other perfectly in that sense. So she is the engineer, she handles the product side essentially. Like the app you saw, she built alone in two months, frontend, backend, design algo. My co-founder handles the engineering technical side, I handle everything else essentially. So fundraise is on me, customer support, growth, getting users on board, legal, finance, all the things that you need to keep a company going, your team has to do everything right, when it was just a two three person team. It was just the two of us, we added the third co-founder rather recently.</p>
<p><strong>Colton:</strong> Now I also have a question for you, I forget which Tinder-like dating app does this or or says this, but one of them has like a slogan like, we're the app that's designed to be uninstalled. So my question to you is is essentially, if your app is to work probably, ideally they would find their partner and then not need the app anymore. Is that correct? Have you ever thought about that?</p>
<p><strong>Hazim:</strong> I mean that was the assumption, that was the assumption we needed to validate essentially. Is it true that when people find a co-founder, they're gone from the app? We've been around long enough, we launched our app in March so it's been over six months since launch. But no that is not true, for three reasons people stick around. So the first reason is this is not like dating in the sense you find your partner you got to leave the apps right? Like you can't just stay on Tinder if you're in a committed relationship, generally that that is the societal convention. But no, not for co-founders. You could find a third co-founder, we added a third co-founder. So they will be as actively swiping. They're open to it because a co-founding team can very well be three people if not up to four people. It is rare to see beyond four person founding team. So this is not like a marriage with one to one generally.</p>
<p>So second reason is people are already finding their early hires on CoffeeSpace. So employee number one two three for example they're very close to a co-founder in nature. So we had double trial periods with people who could be our first founding hirers as well. Through CoffeeSpace, they swiped on us. So they told us, "I'm exploring ideas but I don't mind being a founding hire as well." So this is the natural expansion again, people are sticking around for that, we have not optimized the platform for that purpose yet, we are not publicly stating that, but it is a use case that we are actively exploring given that it is already happening on the platform. A third of the people who have told us, they are working together right now are actually of early hires. They might need more than just that first original founding team.</p>
<p>The third reason, so the third reason is just the velocity of startup life, like 6-12 months is roughly the lifespan of startup. Marriages is a lot longer, 15-20 years. So within 6-12 months we see them coming back because even if it's a good co-founder relationship, if the idea is invalidated and they need to explore something else, we have users who come back, like you know, okay we need to explore something. As long as you have the startup bug yeah you always need something. That is very fair like startup founders rarely just start one. It's just the nature of this space right, it's very hard to have a startup immediately succeed usually it takes a few iterations just like ourselves it took us three iterations before we got to this idea. So that actually helps people come back and yeah so the LTV you know the tail life of people on our platform is a lot longer than we initially assumed.</p>
<p><strong>Colton:</strong> What is the app built with?</p>
<p><strong>Hazim:</strong> So on the frontend it's built with FlutterFlow, so that's the frontend. Backend is Firebase. But yeah Proxycurl is one of the tools we use to enrich the users profiles. We have the founder profile, the co-founder preferences but you do want basically the enrichment of LinkedIn information, the experience, education.</p>
<p><strong>Colton:</strong> So you said that you used Flutter for the frontend but what was the backend?</p>
<p><strong>Hazim:</strong> Firebase. The simple reason it just integrated really quickly and easily with Flutter Flow. Because we're using Flutter Flow on the frontend it affects many of the decisions of the other tools we use, for example we chose Revenue Cats for subscription management instead of Stripe because it just integrates easier with Flutter Flow.</p>
<p><strong>Colton:</strong> I'm going to look that up really quick.</p>
<p><strong>Hazim:</strong> Yeah I never heard of Revenue Cats before that but yeah they've done the job for us we've been very happy using the platform. They are basically an alternative to Stripe for subscription management.</p>
<p><strong>Colton:</strong> So the general app is essentially like we were talking about a little bit earlier, it's kind of just being about like the Tinder for startup founders essentially. So it's just it's all centered around like finding the missing puzzle piece for your startup idea. So like if you're maybe you know the business, marketing, sale- oriented side, you might want the technical co-founder on the other hand. So it's just about about integrating and connecting these people at the end of the day.</p>
<p><strong>Hazim:</strong> So basically we collect data points and based on these data points we match people up algorithmically. People can change their preferences and all it's quite, I mean ,the UI is quite similar to Hinge. That was our main source of inspiration Yeah like Tinder yes, or the Tinder no. So you can't exactly swipe but this is deliberate right because when you can just swipe you're going to too long, you're not going to deliberate too much on a profile. So that's why Hinge you have to like a specific part of the profile, to optimize for a match, to optimize for connection. So that is the model we will be, we are going after essentially. We will not introduce a swipe element anytime soon until validated people will still put in the time deliberation as they should.</p>
<p><strong>Colton:</strong> Okay and then so when you sign up you have to insert your LinkedIn URL right. So you're using our API on the backend, Proxycurl to populate a lot of the profile information from that LinkedIn URL?</p>
<p><strong>Hazim:</strong> That's right, profile picture, education, experience mainly. There are other elements which we might use in the future depending on what users tell us they want, what the algorithm needs but yeah, that is what we are doing and that saves users a lot of time.</p>
<p><strong>Colton:</strong> So that's, that right there is primarily how you're using Proxycurl right now.</p>
<p><strong>Hazim:</strong> But it's also for the initial review of users right. We are now building an auto, thus far, I have reviewed every single person you know the 5,600 people have joined CoffeeSpace.</p>
<p><strong>Colton:</strong> So that's how many people that, I was going to ask that as well.</p>
<p><strong>Hazim:</strong> Yeah that's how many people we have on CoffeeSpace right now. We need to know that it's an actual person right. You are verifying right now you're verifying individually everybody that's most people go through of course but yeah there are specific things we look for within the LinkedIn profile to approve it otherwise right it's likely that this person has not because people don't even populate their LinkedIn profiles too much it's hard for us to believe they are serious about. There are there are some people that are you know qualified business individuals that relatively empty education experience. If it's zero experience, zero education, it will require my manual intervention to look at but this also you know number of followers. If they've only started the account you know with 10 followers for example. It's not a definite so it's like there's an auto approval process not an auto denial. I will be reviewing the edge cases for me to see like you know if this is a suitable to be on the app.</p>
<p><strong>Colton:</strong> Have you received any funding yet for CoffeeSpace?</p>
<p><strong>Hazim:</strong> Yeah so we have raised a total of half a million thus far, so these are mainly from angels, many of these angels are actually our users so it's interesting right because these people are in the startup space quite a few of them are angel investors. They're exploring some ideas themselves but yeah we have raised $500,000 to date from angels. yeah. Nice.</p>
<p><strong>Colton:</strong> When I was using the app it kind of looks like your monetization strategy is just to make it easier to find partners, is that fair, like that's your monetization?</p>
<p><strong>Hazim:</strong> We're motivated to solve it faster. So the basic version, the minimum version free version of CoffeeSpace is good enough to give people leads consistently but if you really want more leads fast so it's basically creating differentiated experiences with artificial scarcity you basically lock certain things which the most motivated people will want. For example I can give an example of a premium filter, it's prior startup experience if you want a filter for people who have sold a company before, started a company before or worked in a startup before at least right then these are premium filters. You don't need a co-founder who has sold a company before if you want that. So if you paid for the premium subscription, you would have the ability to essentially filter for more qualified individuals, you get more leads per day, you get premium filters, your invites go up of the top of the list instead of chronologically. If for example you had 10 invites the person with the premium account would have their invites go right up to the list but yeah these are all strategies dating apps have used that we have learned from essentially.</p>
<p><strong>Colton:</strong> Gotcha. What are you doing to grow? What is the future? Like what do you have planned for?</p>
<p><strong>Hazim:</strong> yeah so We're getting users through a few main ways. One is of course word of mouth. People who are looking for co-founders have spoken to other people looking for co-founders. So because we're so niche at this point not many people are serving the co-founder matching space. Apart from Y-combinators co-founder matching platform there are not really that many other incredible, very established or other platforms out there. So word of mouth is one, users post testimonials about this like we did a Product Hunt launch. So these big events like Product Hunt, like TechCrunch, they give us waves of new word of mouth, like new engagement. LinkedIn I've been building in public so I've been posting our progress almost every week basically on LinkedIn, Twitter has been another major source but yeah these have been our main ways of get to users.</p>
<p><strong>Colton:</strong> Mostly just organic word of mouth just getting your name out there.</p>
<p><strong>Hazim:</strong> More or less, social media, PR basically we've had multiple people publish about this on their blogs and we've been featured in a few sites.</p>
<p><strong>Colton:</strong> I could imagine sites like Indiehackers could be useful for you or even like even like college campuses in the United States as well.</p>
<p><strong>Hazim:</strong> I mean funny you say that because yeah one of our users, so Stanford is our number one user pool by school. Stanford people make up about 10% of the users pool of CoffeeSpace right now. So what one of our users did was he published us, he wrote a simple email in a newsletter, in a mailing list called Stanford Venture groups. Everyone in Stanford, generally at grad school and above building is start up. 80 people signed up overnight just from that one email. So schools have been where word of mouth has been propagated by users sharing about it in mailing list, Slack groups WhatsApp groups.</p>
<p><strong>Colton:</strong> For the future what do you guys have planned do you have anything major planned uh for the near future?</p>
<p><strong>Hazim:</strong> I mean of course right we're preparing for Tech Crunch. Some of the things we're working on in house is of course is improving the algorithm itself right. That is a consistent thing, a continuous process we are doing but there are three main phases to it. The first one is what we already have on the app is called the Boolean level, are you within 50 miles of me, are you technical or not technical, are you open to an equal split or like you're fully negotiable equity wise. So these are like just yes no parameters, but the next level is what we are now able to start exploring because of Proxycurl actually. This is what we call the social bar level. With LinkedIn information I can actually start defining what are the similar people to those you're swiping right on. As you swipe we can actually now you swipe data to say, hey you've been, you haven't told us this preference within your profile setup but you keep swiping on people with seven plus years experience in Fintech. This is a data point we will use to further self teach the algorithm to get better, to learn what what is relevant to you. So this is the second level.</p>
<p>The third level is what we call the semantic level. This is where we're going to use some OpenAI embeddings to start defining the semantic level. If you and I are both building in travel, we define our ideas, we post this information through the OpenAPI and these are the two statements of our ideas. If our ideas are 90% match we should be ranked higher than just some random non-matching ideas etc. But yeah we can do the same for working style, this is my motivation to build start up, this is my working style, this is what I want to devote my life to. So the algorithm will be a big part of what we continue to do to make this better as the number of user scale because we need to guarantee, I mean, we need to ensure relevance as this thing scales. Otherwise you have a million people on it, it's going to be much harder for you to find the right person if it doesn't learn from you. Second is basically exploring, this second or third problem space, co-founder matching will be our focus at least for the next year, year and a half, up to Series A most likely but beyond that like it's these two problems spaces, it's either the early hire space or the one we feel is more synergistic immediately is just basically unlocking the value of the data. Because accelerators, early stage investors have already told us, Hazim you have information that is very valuable within your database. Essentially you know before anyone else when someone wants to build, before they apply to VCs, because we people only apply to VCs when they have a co-founder. But we know before they have that. If I want to be the first check to these founders that is very valuable information. So it's basically creating a backend equivalent where investors will be able to see profiles of users who opt in for this. So users will be triggered a notification, hey there are investors who might want to look at your profile, would you want to opt-in. I've interviewed dozens of users, there's this the time as share my, you know, share my information with them, if you tell me five people 5 VCs view my profile this week I'm going to be very motivated to check my profile. Not only that but make it updated.</p>
<p><strong>Colton:</strong> That is very valuable data for sure.</p>
<p><strong>Hazim:</strong> It's a living network instead of Crunchbase Pitchbook which is more passive data. Why LinkedIn is so available is because it's active data is a network but that is the equivalent we will do on CoffeeSpace essentially because it is a living network.</p>
<p><strong>Colton:</strong> Is there anything else you'd like to like to share?</p>
<p><strong>Hazim:</strong> There is of course, there's a lot of uncertainties maybe even stigma against people finding co-founders on such a platform. The general perception is that you must know your co-founder through school, through like you know this history right because there is trust, you know the startup journey is very difficult so you need that strong bond, at least that is the perceived. But it's the same thing as online dating, I would say 10 years ago no one would believe online dating could be a thing, should be a thing. Now 30% Americans find their long-term partners online, and it's the same for co-founder matching.</p>
<p><strong>Colton:</strong> Actually I'm part of that statistics.</p>
<p><strong>Hazim:</strong> Exactly my co-founder found her partner on Hinge herself. It's just yeah it's a stigma before it becomes mainstream, it's the same thing here, like YC has already funded 28 companies, 28 pairs who met through their co-founder matching platform. If you do the math they're only taking in 1-2% of people which means hundreds if not not more than a thousand, 2,000 pairs have formed just through YC's co-founder matching. And as this becomes more mainstream we feel like what Tinder, Bumble. Hinge did for online dating, that is what we want to do for people starting companies globally. So that is what CoffeeSpace, that is the long-term vision of CoffeeSpace essentially and that's what makes us excited each day to work on this everyday.</p>
<p><strong>Colton:</strong> Awesome, honestly I love the idea. I really like the Tinder for startup founders twist. angle. I think it's really cool, I wish you the best best of luck, thanks for watching guys.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The Most In-Depth Guide to 19 Clearbit (Breeze Intelligence) Competitors &amp; Alternatives ]]></title>
        <description><![CDATA[ Possibly the most in-depth breakdown of 18 Clearbit competitors &amp; alternatives that covers features, ratings, prices and more. Specially made for sales and marketing teams. ]]></description>
        <link>https://nubela.co/blog/clearbit-competitors-alternatives/</link>
        <guid isPermaLink="false">66f661265ad68b0001185eac</guid>
        <category><![CDATA[ alternatives ]]></category>
        <dc:creator><![CDATA[ Jo Chng | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/09/WhatsApp-Image-2024-09-27-at-4.03.46-PM-1.jpeg"/>
        <pubDate>Fri, 27 Sep 2024 16:42:16 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_406.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>“Is there another way I can do this?”</p>
<p>That’s a question I ask myself all the time. If you’re here, that means you’re the same. You like having options because B2B sales is all about options, it’s about making yourself look like the best option while searching for better options. And while Clearbit, now under the Breeze Intelligence name, has positioned itself as one of the major giants in sales and marketing intelligence, the truth is they aren’t the only option you have.</p>
<p>Great news. You don’t have to do the legwork. I’ve done it for you. I present to you, a summary of 19 Clearbit competitors and alternatives.</p>
<h2 id="tldr-table"><strong>TL;DR Table</strong></h2>
<p>Obligatory disclaimer: I’ve done my best to crosscheck the information here but every company has a different way of presenting their information and it changes over time, so I have to put a few disclaimers here.</p>
<ol>
<li>The average rating is an average across G2, Capterra, and Trustradius. Data accuracy is always going to be an issue with all these platforms so please take complaints and praises of data accuracy with a grain of salt.</li>
<li>I’m only comparing the lowest prices of each service per month for 1 single user, without any sorts of discount codes/referrals, etc. Most of these companies offer long contracts so you will probably get a better deal with annual plans.</li>
<li>Some companies only mention ‘company profiles’ and some mention ‘personal profiles’. I mark personal profiles/contact information with a ‘*’ as these tend to have higher numbers than company profiles.</li>
<li>The refresh rates refer to whatever I can find on the company websites, but they may not be a reflection of whether their data is accurate or not.</li>
</ol>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>Platform</td>
<td>Average Rating</td>
<td>Price/Month</td>
<td>Database  (Published Profiles)</td>
<td>Refresh Rate</td>
</tr>
<tr>
<td>Clearbit / Breeze Intelligence</td>
<td>4.4</td>
<td>Custom</td>
<td>50M, 389M*</td>
<td>Daily</td>
</tr>
<tr>
<td>Proxycurl</td>
<td>3.9</td>
<td>49</td>
<td>19M, 493M*</td>
<td>Real-Time</td>
</tr>
<tr>
<td>Sapiengraph</td>
<td>-</td>
<td>49</td>
<td>19M, 493M*</td>
<td>Real-Time</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>-</td>
<td>Usage-based</td>
<td>N/A</td>
<td>Real-Time</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td>4.2</td>
<td>Custom</td>
<td>104M, 321M*</td>
<td>30 Days</td>
</tr>
<tr>
<td>Apollo.io</td>
<td>4.4</td>
<td>49</td>
<td>35M, 220M*</td>
<td>Real-Time</td>
</tr>
<tr>
<td>Cognism</td>
<td>4.3</td>
<td>Custom</td>
<td>10M, 400M*</td>
<td>Daily</td>
</tr>
<tr>
<td>Lusha</td>
<td>4.1</td>
<td>49</td>
<td>15M, 100M*</td>
<td>Real-Time</td>
</tr>
<tr>
<td>Lead411</td>
<td>4.6</td>
<td>99</td>
<td>20M, 450*</td>
<td>30 days</td>
</tr>
<tr>
<td>UpLead</td>
<td>3.7</td>
<td>99</td>
<td>16M, 155M*</td>
<td>30 days</td>
</tr>
<tr>
<td>RocketReach</td>
<td>4.1</td>
<td>70</td>
<td>35M, 700M*</td>
<td>30 days</td>
</tr>
<tr>
<td>Leadfeeder</td>
<td>4.2</td>
<td>99</td>
<td>175M*</td>
<td>Real-Time</td>
</tr>
<tr>
<td>6sense</td>
<td>4.2</td>
<td>Custom</td>
<td>65M, 415M*</td>
<td>14 days</td>
</tr>
<tr>
<td>Adapt.io</td>
<td>4.0</td>
<td>49</td>
<td>12M, 250M*</td>
<td>Daily</td>
</tr>
<tr>
<td>LinkedIn Sales Navigator</td>
<td>4.4</td>
<td>99</td>
<td>67M, 1.9B*</td>
<td>12 hours</td>
</tr>
<tr>
<td>Seamless.ai</td>
<td>3.7</td>
<td>Custom</td>
<td>121M, 1.3B*</td>
<td>Real-Time</td>
</tr>
<tr>
<td>LeadForensics</td>
<td>4.1</td>
<td>Custom</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Demandbase</td>
<td>4.3</td>
<td>Custom</td>
<td>99M, 150M*</td>
<td>30 days</td>
</tr>
<tr>
<td>LeadIQ</td>
<td>4.0</td>
<td>45</td>
<td>-</td>
<td>Real-Time</td>
</tr>
<tr>
<td>FullContact</td>
<td>4.1</td>
<td>99</td>
<td>247M*</td>
<td>15 minutes</td>
</tr>
</tbody>
</table>
<h2 id="what-does-clearbit-do"><strong>What does Clearbit do?</strong></h2>
<p>At their core, Clearbit is an all-in-one sales intelligence platform that gives you information on your current clients and potential clients.</p>
<p>Still confused? I’ll break it down for you.</p>
<p>So you need to sell your product. It’s homemade artisan ice cream. Currently, you have a grand total of 2 shops who resell your ice cream. But you want to take your business to the next level. You want to sell more ice cream, to more people, to bigger companies. How do you do that? You need information.</p>
<p>Companies like Clearbit take a look at your existing customers i.e. that one corner store who stocks your homemade ice cream in their tiny freezer, and the coffee shop on the next block who sells hipster coffee, and then compares it with their list of shops. Then they tell you, “Hey, there are two more hipster coffee shops and three mom-and-pop stores in the area, why don’t you ask them if they want to stock your ice-cream?”</p>
<p>Sure, you could have walked around the block casing all the coffee shops and local grocery stores, making your own list, and then going up to them one by one, asking to meet the owner. But that would have taken a lot of time. And the chances are, they might not be interested and you wouldn’t find out until you got there.</p>
<p>Sales intelligence platforms like Clearbit reduce the amount of legwork you have to do because they have a giant database of company information. They can give you a list of companies that are similar to the ones already in your current customer base. On top of that, most of them can give you the direct contact information of the people who make the decisions. So instead of having to ask someone to “Get me your manager”, you can get a phone number or email directly from Clearbit and contact the person easily.</p>
<p>In recent years, Clearbit has expanded their offerings to include a multitude of other sales tools, like telling you who’s been searching up ‘homemade ice-cream’ near you, browser extensions that connect you to ice cream aficionados around the world, and AIs that can help you write emails about why your ice cream is the tastiest one on the block.</p>
<h3 id="clearbit-pricing"><strong>Clearbit Pricing</strong></h3>
<p>All this is sounding a little too good to be true. Which it probably is. There’s no such thing as a free lunch and Clearbit’s menu doesn’t have any prices. After digging through some of the internet, it seems that their basic package starts at $99. That’s a little steep for startups and small businesses. If you head over to their G2 (4.4/5), Capterra (4.4/5), and Trustradius (8.1/10) reviews, you might notice that some people aren’t quite as satisfied with their interface and the quality of their data.</p>
<p>But don’t worry, you’ve got options. I’m gonna give you 19 Clearbit competitors that you should consider.</p>
<h2 id="proxycurl"><strong>Proxycurl</strong></h2>
<p>Are you a developer? Are you looking for an API solution that will get you fresh B2B data at scale? It was us. We had your back. I’m not going to pretend that Proxycurl was a full-fledged alternative for Clearbit or some of the other companies listed here.</p>
<p>We didn’t have dashboards telling you how many people are looking at your website. We didn’t analyze your customers and suggest ICPs with an algorithm. We didn’t write emails for you and tell you when you should call or text a prospect.</p>
<p>Instead, we were a fully self-managed REST API that pulled fresh, raw B2B data for your applications.</p>
<blockquote>
<p><strong>Update:</strong> Proxycurl and Sapiengraph have since been sunset. I’m retaining these sections because a lot of people still search for them by name, and because the products genuinely shaped this space. The founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is the spiritual successor if what you actually want is proprietary B2B intelligence instead of just another recycled lead database.</p>
</blockquote>
<p><a href="https://nubela.co/proxycurl/people-api?ref=nubela.co"><img alt="Proxycurl People API pulls and enriches people data programatically " src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/09/Proxycurl-People-API.jpeg" /></a></p>
<p>You wanted to search for companies in your ICP? We had a Company Search API Endpoint. Want to look for people in your buyer personas? We had the Person Search API Endpoint. Need to track job changes of prospects? We wrote about how to track their job changes programatically. Found an email, can’t find the person? Use the Reverse Email Lookup Endpoint. Or maybe you found the person, but couldn’t find their contact information. The Contact API could get those for you.</p>
<p><img alt="Proxycurl's API offerings that include person API Business API" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/px-features.png" /></p>
<p>The data enrichment API products were fully compliant with GDPR and CCPA data and privacy laws, and were also in the process of getting SOC2 Type 2 certified.</p>
<p>Where did the data come from? It was updated daily from public profiles pulled from major sites like LinkedIn and Crunchbase, that’s why we guaranteed that the information was less than 29 days old.</p>
<p>If you needed a more comprehensive lead list with more data, Proxycurl offered LinkDB. It's an exhaustive dataset of all the close to 500M of profiles we had. You could buy it at a standalone price, or choose to get quarterly updates to ensure your data kept up with global changes. The best thing was that you could segment the data according to your needs so you didn’t end up with profiles from a different part of the world that you were never going to target.</p>
<p><a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co"><img alt="Proxycurl's LinkDB, an exhaustive data set of 474 million public LinkedIn profiles." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/px-linkdb.png" /></a></p>
<h3 id="proxycurl-ratings-and-reviews-3950"><strong>Proxycurl ratings and reviews (3.9/5.0)</strong></h3>
<p>Proxycurl is rated 3.9 on G2. Most regular B2B companies tend to go for full service platforms over pure developer REST APIs so we didn’t have a lot of reviews. </p>
<p>Most of our customers were satisfied with how fast and easy to use our API, and how it did exactly what it said it would. Most of the developers liked our documentation. It was easy to read.</p>
<p>The biggest complaint about Proxycurl was that we only had annual plans paid by monthly installments, which I understand, is not everyone’s cup of tea.</p>
<h3 id="proxycurl-pricing"><strong>Proxycurl pricing</strong></h3>
<p>Proxycurl had both annual (paid in monthly installments or in one lump sum) and pay-as-you-go (PAYG) plans. The starter annual plan averaged out to be $49/month with 2500 credits.</p>
<p><img alt="Proxycurl's annual subscription plan, paid monthly, starting at $49/month for 2500 credits. " src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/px-pricing.png" /></p>
<p>I thought this was pretty straightforward. You got 2500 credits every month and they expired after 30 days. The amount of data enrichment you could pull wholly depended on which parameters you used because some were premium parameters that consumed 30 credits per profile returned, and some of them just cost 1 credit.</p>
<p>But maybe you didn’t want to commit just yet. That was okay. We had PAYG plans starting from $10 for 100 credits.</p>
<p><img alt="Proxycurl's flexible Pay-as-you-go pricing plan with 18 months validity" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/px-pricing-2.png" /></p>
<p>Credits on the PAYG plan didn’t expire unless your account had been inactive for more than 18 months so you didn’t have to rush to finish them all in a month. Start with 800 or so, test it out, and then buy more as you needed them.</p>
<h3 id="who-should-try-proxycurl"><strong>Who should try Proxycurl?</strong></h3>
<p>Historically, companies looking for an easy-to-use REST API for their B2B data enrichment needs. Or developers who wanted the code, nothing but the code, and the whole code without having to pay exorbitant or opaque prices to access APIs.</p>
<p>Today, if that’s what you want, skip down to NinjaPear.</p>
<h2 id="sapiengraph"><strong>Sapiengraph</strong></h2>
<p>Okay, so you’re NOT a developer and everything I said in the previous section made your eyes glaze over. You just want to search for leads and enrich data. You want something you can just jump into without spending 5 hours on uploading or syncing data from your regular CRMs.</p>
<p>Well, Sapiengraph was the home of 5 minute growth tools, easy tools that you could start using immediately without extensive know-how.</p>
<p>Right now, we had a prospector tool. You could search for CEOs, CTOs or any other key-decision makers via your dashboard. Just fill out the filters, hit enter. You could even choose to return only profiles with emails or personal numbers attached.</p>
<p><img alt="Sapiengraph's Sales Prospector that allows people to find leads in 5 minutes" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/SG-Prospector.png" /></p>
<p>Sapiengraph also had a browser extension that allowed you to use custom Google Sheet formulas, and a free job change monitor. You could get B2B data immediately in your own spreadsheets without having to learn how to use a new platform.</p>
<p><img alt="Sapiengraph's browser extension enables job change monitoring on LinkedIn." src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdvrgYElaCm9nfVZHgT74Pu6T8OJquR2xkxeOxGqqGgUk8Rc4cgkM39T2zdSGeCD2iRlg5bCsSmxHwhqyFvAKdlKbFIOfPqHM6rB9-4cHj_iQ79wsRxrn0gLVazJwhplEanVkMuQboi6ZMb6QO_zcA0koMw?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>If you wanted to monitor someone’s employment, all you needed to do was enable the extension and click monitor job change on their LinkedIn profile. You could monitor up to 20 profiles for free.</p>
<h3 id="sapiengraph-ratings-and-reviews"><strong>Sapiengraph ratings and reviews</strong></h3>
<p>Our review page was waiting for you to try out our growth tools and leave your comments.</p>
<h3 id="sapiengraph-pricing"><strong>Sapiengraph pricing</strong></h3>
<p>Sapiengraph had monthly plans that started at $49 for 12500 credits that expired every billing period.</p>
<p><img alt="Sapiengraph's pricing plan, starting at $49 for 12500 credits. " src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/SG-pricing-1.png" /></p>
<p>12500 credits could get you anywhere from 150 to 250 enriched leads. You could try it out with 100 free credits just by signing up for an account. Please note that the type of enrichment you performed consumed a different amount of credits.</p>
<h3 id="who-should-try-sapiengraph"><strong>Who should try Sapiengraph?</strong></h3>
<p>Historically, companies and people who loved spreadsheets and easily got overwhelmed by long setup processes that some other alternatives required before you could get the full value of their services.</p>
<p>Today, most of that energy has moved into NinjaPear’s spreadsheet-style prospecting workflows.</p>
<h2 id="ninjapear"><strong>NinjaPear</strong></h2>
<p>If Proxycurl was for developers and Sapiengraph was for spreadsheet people, NinjaPear is what happened when I got tired of recommending half-solutions.</p>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is not just another lead database with a prettier UI. It’s a competitive intelligence data platform. That means it does the normal enrichment stuff, yes, but the more interesting bits are the things most vendors still can’t do well: customer discovery, competitor mapping with evidence, company monitoring across blogs, X, and site changes, and prospecting workflows that chain all of that together.</p>
<p>This matters because Clearbit is good at enrichment, but enrichment alone is a blurry picture. When I was running growth teams, the real question was rarely “what’s this company’s headcount?” The question was “who do they sell to, what changed this week, and why is this account suddenly worth my rep’s time?”</p>
<p>NinjaPear is built around those questions.</p>
<p>A few pieces stand out:</p>
<ul>
<li><strong>Customer API</strong>: find B2B customers of a company, even when nobody publishes a customer list.</li>
<li><strong>Competitor API</strong>: map competitors with evidence and confidence scoring.</li>
<li><strong><a href="https://nubela.co/monitor-api?ref=nubela.co">Company Monitor</a></strong>: track blogs, X posts, and website changes in one RSS-like feed.</li>
<li><strong><a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a></strong>: a spreadsheet with superpowers, where you can go from company to competitors to customers to employees to work emails.</li>
<li><strong>Company API / Employee API</strong>: enrichment primitives like company details, employee count, person profiles, and work emails.</li>
</ul>
<p>The pricing model is also different from the enterprise-sales nonsense that infects this category. NinjaPear starts with a 3-day free trial, 10 credits included, no credit card required, and then shifts to usage-based pricing. Pay for calls. Move on with your life.</p>
<h3 id="who-should-try-ninjapear"><strong>Who should try NinjaPear?</strong></h3>
<p>People who are tired of paying for static lists and want live market context. Especially if you prospect off triggers, monitor accounts, build outbound around competitors’ customers, or want API-first access without committing to a six-figure platform before you’ve even tested the damn thing.</p>
<h2 id="zoominfo"><strong>ZoomInfo</strong></h2>
<p>If you’ve heard of Clearbit, then you’ve probably heard of ZoomInfo. They are one of the more well-known Clearbit competitors out there. It’s pretty large in its own right. They have an all-in-one platform that gives their users information on who to reach and how to reach them.</p>
<p><img alt="ZoomInfo's database of people profiles, company profiles, and contact information." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/zoominfo-database.png" /></p>
<p>Like Clearbit, ZoomInfo started out as a B2B company data provider. Over time, they expanded to cover all aspects of business management like marketing, operations, data services, and talent management.</p>
<p><img alt="" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/zoominfo-features-platforms.png" /></p>
<p>If you’re running a big business and you’re tired of using 5 or 6 different providers to manage your sales, marketing, operations, data, and talent, you might want to consider ZoomInfo. Their comprehensive tools and extensive integrations mean that you can use them with your existing CRMs and other tools easily. Perfect if you’ve already gotten other parts of your business set up the way you like it.</p>
<p>Not only do they have an extensive database, (1.3B companies recorded, 100M published), they also have features like advanced search filters and an AI copilot. Included in their extensive search filters is something called Scoops that allows you to get really, really specific about what you’re searching for. And I do mean specific.</p>
<p><img alt="ZoomInfo's Scoops Feature with filters checked" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/zoominfo-feature-scoops.png" /></p>
<p>Their AI copilot also helps you to stay on top of your pipeline by suggesting actions for you to take in a timely fashion.</p>
<p><img alt="ZoomInfo's AI copilot providing recommended actions." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/Zoominfo-feature-ai.png" /></p>
<p>While other data providers may refresh their data points a few times a month, ZoomInfo says that they refresh data points on a daily basis. While this doesn’t preclude the possibility of having outdated information, they have a pretty solid track record of great data.</p>
<h3 id="zoominfo-ratings-reviews-425"><strong>ZoomInfo ratings &amp; reviews (4.2/5)</strong></h3>
<p>Right off the bat, we can see that the company is pretty highly rated on G2, Capterra, and Trustradius.</p>
<p><img alt="ZoomInfo reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/zoominfo-rating.png" /></p>
<p>ZoomInfo has an average rating of 4.2. Not a surprise because they bring a lot to the table.</p>
<p>However, because of the vast amount of features they have, users can sometimes get lost or frustrated by the amount of effort needed to get everything set up in the initial stages. There’s a bit of a learning curve (as with any large product) and users have reported feeling frustrated with the lack of customer support available.</p>
<h3 id="zoominfo-pricing"><strong>ZoomInfo pricing</strong></h3>
<p>Like Clearbit, ZoomInfo doesn’t list their prices on their website. Cue, chorus of groaning from introverts around the world.</p>
<p><img alt="ZoomInfo's pricing page." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/zoominfo-pricing.png" /></p>
<p>You have to get in touch with their sales team in order to figure out a custom package because they tailor their prices according to how many features you want to use and how many people in your company need access to the platform.</p>
<p>The good news is that you can sign up for only the features that you want. However, Will Aitken (Co-Founder of Sales Feed) mentioned that getting access to their data enrichment tools easily costs about $1000 a month, making it pretty much unaffordable for small businesses.</p>
<h3 id="who-should-try-zoominfo"><strong>Who should try ZoomInfo?</strong></h3>
<p>Large enterprises that are looking for an all-in-one solution and are scaling up their sales should definitely look into ZoomInfo for their data enrichment needs. For mid-sized and smaller companies, you can keep scrolling.</p>
<h2 id="apolloio"><strong>Apollo.io</strong></h2>
<p>Apollo.io is another popular end-to-end platform for sales teams out there. Unlike Clearbit and ZoomInfo which aim to become a comprehensive all-in-one solution for businesses, Apollo is more focused on the sales pipeline. Boasting 275M contacts from all over the world, they have a pretty large database of company information.</p>
<p><img alt="Apollo.io's database and accuracy guarantee" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdJu4nwsphrfx6N7dqD8H7B-OXk7q46rUMKCXkEkgy2huXoQP9jxsDJCLtH8-I3aMAkS0WWAr64quHBoX7PDT2WIAUm2jOYCZam1mkkRyE-USbKExxtEUynV9vlXd-7HfJ9DEiL6RLTzB2AsuCXvhz4ECy9?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>If you’ve got existing CRMs or systems in place, you don’t need to worry because Apollo.io works with many of the popular platforms like Salesforce and Hubspot.</p>
<p>Apollo updates data signals like job changes or emails and phone numbers in real time, and runs monthly refreshes of their database to ensure that data accuracy.</p>
<p>They do a great job with workflow automation, letting you create something known as ‘Sequences’. These sequences let you automate multi-step processes for sales outreach like sending emails and making calls.</p>
<p>Like ZoomInfo, Apollo.io has an AI writing assistant that helps you create personalized emails for your prospects.</p>
<p><img alt="Apollo.io's AI writing assistant" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/apollo-feature-ai-writer.png" /></p>
<p>The AI writing assistant has a pretty helpful section in their personalization settings. You don’t need to manually prompt the AI, just fill in the empty boxes with the pertinent information and the AI will do the rest.</p>
<p>Personally, I was intrigued by Apollo’s in-built dialer. You don’t need to pick up your phone or type in numbers because Apollo can do it for you.</p>
<p><img alt="Apollo.io's inbuilt dialer" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/apollo-feature-dialer.png" /></p>
<p>Users from inside the US and Canada can use local numbers whereas users from other countries will have to request international phone numbers. International numbers are only available on certain plans so make sure you get the right one.</p>
<p>Apollo.io takes their regulations and compliance seriously so using their in-built dialer requires a lot of documentation. Check their requirements so that you don’t miss out on any.</p>
<h3 id="apolloio-ratings-reviews"><strong>Apollo.io ratings &amp; reviews</strong></h3>
<p>Apollo.io is pretty well-received and has an average rating of 4.5 across G2, Capterra, and Trustradius.</p>
<p><img alt="Apollo.io reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/apollo-rating.png" /></p>
<p>Overall, users like Apollo.io’s intuitive interface and multiple integrations, particularly Bombora, which shows buying intent. Sales teams spent less time on trying to find email addresses or phone numbers and more time moving their leads through the pipeline instead.</p>
<p>Other users have run into issues with data accuracy, which is a common issue for all data providers when you’re crawling the interwebs for billions of contact data.</p>
<h3 id="apolloio-pricing"><strong>Apollo.io pricing</strong></h3>
<p>I’d like to thank Apollo.io for having a transparent pricing structure on their page. They have a free plan which is perfect for testing the waters. Their free plan comes with unlimited email credits (Yes you heard that right, it’s unlimited), 60 mobile credits, and 120 export credits that are renewed every year. It’s not a lot for businesses that are aiming to pull in 50-100 sales a month, but it’s a good starting point for a startup.</p>
<p><img alt="Apollo.io's pricing plan." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/apollo-pricing.png" /></p>
<p>Apollo.io’s most basic plan comes in at $49 per month for each user, which is still within the realm of affordable, and also gives you the option to add on credits if you run out at one point.</p>
<h3 id="who-should-try-apolloio"><strong>Who should try Apollo.io?</strong></h3>
<p>Small to mid-sized companies who only want a sales management solution can benefit from getting Apollo.io. Their affordable price and flexible credit system makes it easier to scale up as you go and they’re considerably easier to navigate compared to the vastness of bigger platforms.</p>
<h2 id="cognism"><strong>Cognism</strong></h2>
<p>Do you need three times more live conversations? That’s what Cognism promises to bring you. This UK based company says that they can connect you to 87% of your leads list because they verify all their contact numbers.</p>
<p>“Oh c’mon, surely all B2B databases verify contact information?”</p>
<p>Most of them do, but not all of them verify the numbers via phone. Cognism has something called Diamond Data where they verify the validity of their contacts by calling each of them one by one. Might sound a little crazy, but that’s what they do.</p>
<p><img alt="Cognism's Diamond Data" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/cognism-feature-diamond-data.png" /></p>
<p>As a result, they have a huge database of global direct dials and 98% of their mobile numbers are verified by humans. If you notice that one of your contacts hasn’t been verified, you can even request verification and Cognism will let you know if the contact is valid within 48 hours. They redial the numbers every year and a half (18 months) to make sure that the contacts are still valid and viable. Before you go rushing off to sign up though, just know that Diamond Data is only available on the enterprise plan.</p>
<p>Another one of Cognism’s boasts is their compliance. They have compliance teams that ensure their data aligns with the ISO 27001 and SOC2 frameworks. They are certified for ISO 27001, ISO 27701, and also SOC2 Type II.</p>
<p><img alt="Cognism's privacy compliances" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/cognism-feature-compliance.png" /></p>
<p>Cognism takes GDPR compliance pretty seriously. Not only do they tell their database about their information being in Cognism, they make sure that their data always complies with the latest international privacy standards. Besides that, Cognism cross-checks their database with global no-call registries so that you can reach your leads without worrying about privacy or legal issues. However this does mean that they don’t provide personal emails, but rather work email addresses only.</p>
<p>Use LinkedIn frequently? Cognism also has a browser extension that can help you export data right into your account from public LinkedIn profiles.</p>
<p>Both Cognism’s platform and extension work with popular CRM tools available in the market like Salesforce and Hubspot so you can integrate it into your workflow right away.</p>
<h3 id="cognism-ratings-reviews-435"><strong>Cognism ratings &amp; reviews (4.3/5)</strong></h3>
<p>Overall, Cognism has a 4.3 across three websites. That’s a pretty decent score.</p>
<p><img alt="Cognism reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/cognism-ratings.png" /></p>
<p>Overall, users have mentioned that Cognism is pretty easy to pick up and integrate into their existing workflows. Customers based in the US mention that the quality of Cognism’s data is pretty good.</p>
<p>However, one thing that Cognism could stand to improve (according to other clients) is their global data. They seem to do well when it comes to the UK and the US but data accuracy drops in other countries, especially in Asia. If you’re thinking about expanding towards the east, you might have to look elsewhere for your data needs.</p>
<p>Generally speaking, Cognism responds pretty quickly to issues that pop up on their platform, making them pretty easy to work with. Props to their customer service team.</p>
<h3 id="cognism-pricing"><strong>Cognism pricing</strong></h3>
<p>Cognism doesn’t list their prices on their website. Like some of the other Clearbit alternatives here, they prefer to give every customer an individual price that depends on the type of licenses or the number of features they want.</p>
<p><img alt="" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/Cognism-pricing-plans.png" /></p>
<p>Cognism's pricing plan.</p>
<p>Unlike Clearbit and other competitors however, they have a platform access fee. Essentially, you pay one price for the data, and another to use the platform. The fee is supposed to cover maintenance, set-up, onboarding, and customer service for the platform.</p>
<p>I found a review that mentioned that Cognism started from about 20000 EUR/year for 100 users, which is akin to 185USD per user, per month. It’s not a thousand bucks, like ZoomInfo and some of the other available options, but it’s not exactly cheap either. Generally, it’s only a great option if you have the budget to spare.</p>
<p>Another thing to note is that Diamond Data (the human-verified phone contacts) is only available to people on the Enterprise plan, so if you’re signing up for that, you might be paying a hefty price.</p>
<h3 id="who-should-try-cognism"><strong>Who should try Cognism?</strong></h3>
<p>Mid to large sized companies with the budget for Diamond Data whose target is the US and UK market, and uses cold calls as their primary outreach. Not every company reaches out via phone call nowadays. If that’s you, then feel free to move on to another data provider. However, if you prefer connecting via mobile, their human-verified phone numbers are a good investment.</p>
<h2 id="lusha"><strong>Lusha</strong></h2>
<p>Another Clearbit alternative you can consider is Lusha. Lusha doesn’t have the biggest database in the B2B industry, but they make a claim for the most accurate database</p>
<p><img alt="Lusha's data coverage, business profiles, company profiles, and contact information" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lusha-data-accuracy.png" /></p>
<p>How do they do it? Basically Lusha has a community program that collects contact information from their client’s databases. If you opt to join this program, you give them access to your business emails and they cross-check the data you have in yours, with the data they have in theirs. Through this community program, Lusha ensures that the data they collect is accurate and reliable so you can double your connect rates.</p>
<p><img alt="Lusha's direct dials" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lusha-direct-dial.png" /></p>
<p>I get that it sounds a little scary, but please be assured that Lusha only accesses professional business data like email headers and signatures to validate and consolidate data. The community program also removes outdated information so that clients can get up to date data.</p>
<p>In accordance with privacy laws, Lusha notifies each professional of their data being collected and gives them instructions on how to manage or remove their profiles.</p>
<p><img alt="Lusha's privacy compliances" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lusha-feature-compliance.png" /></p>
<p>Lusha is GDPR and CCPA compliant and maintains SOC 2 Type 2, ISO 27001, and ISO 27018 certifications so you don’t need to worry about accidentally calling someone on a DNC list.</p>
<p>Lusha also tracks intent data for you and makes it easily available in both contact and company view.</p>
<p><img alt="Lusha's intent data" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lusha-feature-intent.png" /></p>
<p>Lusha uses Bombora’s company surge to see how many people at a particular company are researching a topic, how often they read about it, and how long they spend on the topic. They analyze that data to create an intent score to tell you what a company currently has in mind. The moment you open a contact or company card, you can see their intent signals.</p>
<p>They might not have as many features as the giants in the industry, but they’re definitely one of the sales intelligence tools to consider.</p>
<h3 id="lusha-ratings-reviews-415"><strong>Lusha ratings &amp; reviews (4.1/5)</strong></h3>
<p>Lusha has a pretty decent rating of 4.1 and plenty of reviews so far.</p>
<p><img alt="Lusha reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lusha-rating.png" /></p>
<p>Lusha has their fair share of supporters. Most of them say that they found integration quite easy. While their desktop UI seems to be pretty intuitive and easy to use, other users have expressed dissatisfaction with their mobile interface because it doesn’t work as fast as expected. Sales teams that want to prospect on the go might want to look elsewhere for their tools.</p>
<h3 id="lusha-pricing"><strong>Lusha pricing</strong></h3>
<p>Lusha has four plans, the lowest one being the Pro plan at $49 per month, per user.</p>
<p><img alt="Lusha's pricing plan, starting at $49/month/user" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lusha-pricing.png" /></p>
<p>The amount of contact information you can get is dependent on your credits, which isn’t stated clearly in the pricing plans. If you’re on a higher plan and decide to downgrade, prepare to lose all the credits you haven’t used. Some users have said that the amount of data they get from Lusha is worth less than the price they pay, especially when it comes to the non-US market.</p>
<h3 id="who-should-try-lusha"><strong>Who should try Lusha??</strong></h3>
<p>Small to mid businesses who are just getting started in the global market. If you’re an enterprise user, you might want to look elsewhere because their credit system starts to eat up at costs as you scale up.</p>
<h2 id="lead411"><strong>Lead411</strong></h2>
<p>Lead411 is just over a decade old and is making great waves in the B2B data market. It’s pretty similar to Cognism and Lusha if you’re looking for alternatives for those two. They cover marketing and recruiting in addition to sales if you’re looking for something that’s more comprehensive.</p>
<p><img alt="Lead411's services as a whole." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lead411-feature.png" /></p>
<p>Lead411 also offers a browser extension, intent data, and API along with numerous integrations with existing CRMs.</p>
<p>They’re still primarily a lead intelligence software platform that provides contact data to sales and marketing teams. If you need some actionable information, they provide access to intent data from Bombora.</p>
<p><img alt="Lead411's intent data" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lead411-feature-bombora.png" /></p>
<p>Lead411 lets you choose something they call topics. You can choose to track topics like industries, competitors, or specific technology. So if your company sells medical instruments, Lead411 can keep you updated about which companies are currently looking to purchase medical equipment. It can also help you determine which of your customers are looking at alternatives so you can reduce your churn.</p>
<p>Set your worries at ease with double verified phone numbers and triple verified emails. Lead411 verifies their contact data manually by calling or emailing the numbers or addresses one by one.</p>
<p><img alt="Lead411's double verified contact data" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lead411-feature-verified-contacts.png" /></p>
<p>For phone numbers, Lead411 verifies each one twice, once by manually dialing the numbers to make sure the right person picks up. The second time is done by looking up the location of the number to see if it matches the recipient.</p>
<p>As for emails, Lead411 checks the validity of the emails in their databases through SMTP and seeing if mail sent to that address is opened. They also have an AI to find the best possible matches for missing emails. Lead411 also reverifies these contacts every 3-6 months, ensuring that you get the most accurate information at all times. If there’s an urgent need, you can also request for real-time verification.</p>
<h3 id="lead-411-ratings-reviews-465"><strong>Lead 411 ratings &amp; reviews (4.6/5)</strong></h3>
<p>At a 4.6 rating, Lead411 is pretty highly rated compared to other products.</p>
<p><img alt="Lead411 reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lead411-ratings.png" /></p>
<p>As usual, I went to read the reviews so you didn’t have to. Customers have praised Lead411 for their prompt customer service and overall great data. There’s also been notes about they’re pretty much value for money because you get unlimited data for a single price.</p>
<p>Accuracy wise, there are some issues here and there with outdated information as with most data companies. Some users have also expressed that they would prefer to have more filtering options available. Regardless, it’s a pretty decent product worth your money.</p>
<h3 id="lead411-pricing"><strong>Lead411 pricing</strong></h3>
<p>You can get Lead411’s Basic Plus Unlimited at $99 per month, per user.</p>
<p><img alt="Lead411's pricing, starting at $99/month/user" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lead411-pricing.png" /></p>
<p>The $99 basic plus unlimited plan comes with unlimited email views and unlimited direct phone number views. They also roll over your unused exports as long as you’re subscribed. If you need more exports, you can purchase them as needed.</p>
<p>But if you’re thinking of subscribing to get their Bombora intent data, you should know that it costs an additional $2500 per user and can only be added onto the Enterprise plan, meaning to say that you have to upgrade your Basic Unlimited plan in order to get the intent data.</p>
<h3 id="who-should-try-lead411"><strong>Who should try Lead411</strong></h3>
<p>Mid to large businesses who need to hit specific sales goals within a specific time frame within the US. They have a limited global database so if you’re looking to expand worldwide, go to the next.</p>
<h2 id="uplead"><strong>UpLead</strong></h2>
<p>Up next is UpLead. With a total of 155M contacts and 16M global company profiles, their database is a smidge smaller than other sales and lead intelligence companies, but they guarantee 95% accuracy.</p>
<p>When you look up email data or contact information, UpLead will then tell you if the information is valid or invalid. 95% of verified, “valid” information is accurate so you can easily contact your leads and increase your sales engagement.</p>
<p><img alt="Uplead's database of B2B contacts and accuracy guarantee" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/uplead-data-accuracy.png" /></p>
<p>One thing I like about UpLead is the option to download only valid contact data. Your credits only get deducted when you hit the download button, so you can save on credits by only downloading valid information.</p>
<p>They cover 50+ data enrichment points that encompass most firmographic and technographic aspects so that you can upgrade your lead prospecting pipeline. However that extent of enrichment is only available through their Enterprise plan so be warned.</p>
<p><img alt="UpLead's verified B2B contact information" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfwAFXwOyKWCz3REWx95DhqNQxVhgR7eqWPbNDlB1ci3cBWmcIgcURRIK6J4cUohexdNxthTtdjoOFWc17Los9vWJFdUXcJp3QWv2J-_73wsRcTbefiDoBRSlGGpyB6wr37FZrfCs7yn__5ji7Xg1YEMASk?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>Uplead refreshes their data daily and verifies contact information in real time. They even rank leads according to their freshness so that you can get accurate and up-to-date information at your fingertips.</p>
<p>Their easy no-fluff UI makes it easy for users to get started immediately.</p>
<h3 id="uplead-ratings-reviews-3655"><strong>UpLead ratings &amp; reviews (3.65/5)</strong></h3>
<p>Uplead ranks lower than the rest of the recommendations on the list with an overall rating of 3.65.</p>
<p><img alt="UpLead reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/uplead-ratings.png" /></p>
<p>While UpLead promises a lot of accuracy and better B2B lead generation, it seems that a lot of their contacts are outdated. The common complaint across the bad reviews say that their data is outdated compared to other companies and that their customer service is a little lacking. However, there are just as many reviews that claim that the accuracy is decent and that the emails are correctly verified, helping companies to reduce bounce rates.</p>
<p>Still, people have complained about the lack of transparency in their billing system so please be careful when you sign up.</p>
<h3 id="uplead-pricing"><strong>UpLead pricing</strong></h3>
<p>All the pricing information is available on UpLead’s website. They have 3 available plans for all your needs.</p>
<p><img alt="UpLead's pricing, starting from $99/month" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/uplead-pricing.png" /></p>
<p>Prices start at $99 per month for 170 credits that you can use to look up verified email addresses and mobile phone numbers. You can also get their chrome extension for free. Because it’s a credit based system, they don’t base it off the number of seats.</p>
<p>Buyer intent data, more comprehensive CRM integrations, and API access are only available through their custom packages so if you’re looking to use all of these features, you’ll have to give them a call.</p>
<h3 id="who-should-try-uplead"><strong>Who should try UpLead</strong></h3>
<p>Mid-sized companies who place emphasis on accurate leads and have the budget for the enterprise plan, but don’t want to take it further than that. If you’re paying $99 a month to get emails and numbers, you’re better off using tools that give you either a better workflow layer or a better API layer.</p>
<h2 id="rocketreach"><strong>RocketReach</strong></h2>
<p>RocketReach has rocketed their way into a few lists over the past few years as a great sales intelligence solution.</p>
<p>The platform offers a database with more than 700M person profiles and 60M companies, promising a 98% deliverability rate for their Grade A emails.</p>
<p><img alt="RocketReach's database of person profiles and contact information." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/rocketreach-data-.png" /></p>
<p>RocketReach has a community program as well. When you sign up, it gives RocketReach access to your email contacts so that they can cross check their information against yours.</p>
<p>RocketReach is very careful about being GDPR compliant and will remove data if requested. If that happens, the individual will be struck from their database. They also hide profiles that don’t meet their standards, choosing to offer a fewer number of high quality profiles instead of a large number of low quality profiles.</p>
<p><img alt="" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/rocketreach-feature-intent-1.png" /></p>
<p>RocketReach's data coverage</p>
<p>A lot of companies promise real-time verification and RocketReach does the same. If you use their browser extension on LinkedIn to look up a person, their information will be verified in real-time. Other contacts are refreshed about once a month.</p>
<p>RocketReach also does something called Lookalike Audiences that takes lead prospecting one step further. Basically, they recommend profiles for you based on who you’ve been looking at so that you can grow your network faster.</p>
<p><img alt="" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdT4CLQPnM-wNw92g0_3zDaVhJdqVN5HTbvEeamvg31-zZcrzg8NLB9gGrLL6zucd5shrS52vvz7CIXV-Rbt2i-ak9lUH22V33JQ6Rcrl3K2B40YJhx_qaEQDp_PjxBpVFDNhgmYx_NI9Ow223bYX82N4J8?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>RocketReach's Lookalike Audiences</p>
<h3 id="rocketreach-ratings-and-reviews-415"><strong>RocketReach ratings and reviews (4.1/5)</strong></h3>
<p>RocketReach stands at about 4.1 on average. They’ve got a pretty loyal customer base so far.</p>
<p><img alt="RocketReach reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/Rocketreach-ratings.png" /></p>
<p>Aside from its affordability (which I’m going to cover in a bit), users praise the ability to scrape fresh data immediately by using their browser extension. Their extension is a hit with most of their users and if you’re someone who spends a lot of time browsing LinkedIn, maybe you can consider RocketReach.</p>
<p>Other users do raise a point in which they say that the number of available integrations should be improved overall.</p>
<h3 id="rocketreach-pricing"><strong>RocketReach pricing</strong></h3>
<p>You can get easy access to RocketReach’s pricing information on their website, with their essentials plan starting at $70 a month per user.</p>
<p><img alt="RocketReach's pricing plans starting at $48/month" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/rocketreach-pricing-1.png" /></p>
<p>At that price point, you get access to most of the basics that you need like exports, charts, API access, their browser extension and integration with Zapier.</p>
<p>However, if you’re looking to integrate this fully into your workflow right off the bat, you’re going to need to get the Pro plan or higher.</p>
<p>Please do note that phone data is only available on plans that are higher than Essentials so companies that operate by cold calling are going to have to get a more expensive plan.</p>
<h3 id="who-should-try-rocketreach"><strong>Who should try RocketReach</strong></h3>
<p>Mid to large companies who want personal contact information in addition to professional contact information and a pretty high sales target. I feel like 500 emails a day is way too much for anyone to need because we’re looking for quality leads, but your mileage may vary.</p>
<h2 id="leadfeeder-dealfront"><strong>Leadfeeder (Dealfront)</strong></h2>
<p>With more than a decade in the industry, Leadfeeder is a pretty solid sales tool in the market. At the moment, Leadfeeder’s main attraction is their website visitor identification.</p>
<p>If you want to know who’s lurking on your website, just install the Leadfeeder Tracker script. Leadfeeder runs a reverse DNA lookup to return the hostname of an IP address. They check this against a database of known IPs and tell you exactly who’s visiting your website.</p>
<p>Most of the time, people who are already on your website are hot leads. Chances are that they are pretty far along in their purchasing pipeline so they’re low hanging fruit. Once Leadfeeder figures out who’s been looking at your website, they also add information about how big the company is, what kind of industry they’re from, and where they’re located.</p>
<p>You can also get a bigger, better understanding of what the company is like by retrieving firmographic data using their IP Enrich API.</p>
<p><img alt="Leadfeeder's IP enrich API" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/leadfeeder-feature-ip-enrich.png" /></p>
<p>This API basically retrieves all the information associated with that particular IP address and helps you to understand who exactly is visiting your side and from where.</p>
<h3 id="leadfeeder-ratings-reviews-425"><strong>Leadfeeder ratings &amp; reviews (4.2/5)</strong></h3>
<p>On average, Leadfeeder comes in at 4.2 across the three platforms.</p>
<p><img alt="Leadfeeder reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/leadfeeder-ratings.png" /></p>
<p>There has been mixed reviews about Leadfeeder. Given that it operates mostly upon intent data and IP information, their B2B data enrichment sometimes leaves something to be desired. Users mentioned that the available integrations don’t work as smoothly as they’d like.</p>
<h3 id="leadfeeder-pricing"><strong>Leadfeeder pricing</strong></h3>
<p>Very transparent, there are only 2 prices. Either you’re on the free plan where you can see data in the past week and only from 100 companies, or you’re on the paid plan at $99 per month.</p>
<p><img alt="Leadfeeder's pricing plan starting at $99 a month" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/leadfeeder-pricing.png" /></p>
<p>One of the things I like is that the free plan only considers identified companies. As in if 10 employees at Company A visit your website a total of 50 times, they will still consider it as 1 company because they have been identified as belonging to Company A.</p>
<h3 id="who-should-try-leadfeeder"><strong>Who should try Leadfeeder</strong></h3>
<p>Large companies looking to convert web visitors into proper leads. It’s a little steep for smaller companies that may not even get that many anonymous visitors, or have trouble doing the outreach to convert these anonymous leads.</p>
<h2 id="6sense"><strong>6sense</strong></h2>
<p>6sense pretty much coined the term Dark Funnel to refer to buyer intent information. They made a name for themselves with regards to predictive analysis based on this invisible, great data (their words not mine). Basically, they use a combination of first party and third party data to take a look at who’s been lurking on your website and then tell you what to do about that.</p>
<p>Like Leadfeeder (Or maybe it’s the other way around?), they perform reverse IP lookups to identify anonymous website visitors. This way, you can identify about 25% of your web visitors. They also partner with external websites that collect user engagement through cookies, aka what they were doing before they were looking at your website. This also means they cover who’s been looking at industry publications, influence outlets, blogs, product reviews, social media and other places aside from your company website. Combined with AI analysis, 6sense says they can give you a pretty accurate overview of who is actively looking for solutions that you can provide.</p>
<p>Now, they don’t stop at website visitors. 6sense has since expanded to provide B2B Data for all your sales and marketing needs. They refresh their data every 45 to 60 days and add data every single month. Firmographic data and technographic data are updated daily and bi-weekly respectively.</p>
<p><img alt="6sense's database of profiles and contact information" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/6sense-data.png" /></p>
<p>As of now, they track 500B intent signals every month and have published about 65M company profiles worldwide.</p>
<p>I was curious about their verification processes but 6sense doesn’t divulge much. It appears that they use a combination of their own proprietary artificial intelligence and human verification to ensure that the contact data that you get is accurate.</p>
<p><img alt="6sense's B2B accuracy guarantee" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfW9SfTtdsXuxnSOpgErPITfxz8l4gPqhGYz_BZzUrnmD4IuVmktfhzpGZpGkf2wrKShVz2ivMxmMayhtSJlsmmvbzOhyaN_qSU-L82XrPi8QBQkvEaQbe4i3kUx3KiPj6GZ7b2irX8ABM7bvc-8Hqc93tW?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>As with many of the Clearbit Alternatives I’ve talked about so far, they have an API that can be integrated into your workflows.</p>
<p><img alt="6sense's API workflows" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd6oYJX8zsybisDROgolTydhBbS0R2gYonmvvNrWtNbVfSFvZe_lEoAltAF8x40AoiNFeHd4wqKiLjS6cGB0hgINUIKUdSNmSQz_xaiPhHMh6eVwYY48NSCD6P8d6xZHHD0SBQdH8rWum3vmjMA-_GkSCw?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<h3 id="6sense-ratings-reviews-425"><strong>6sense ratings &amp; reviews (4.2/5)</strong></h3>
<p>6sense is rated pretty much the same as Leadfeeder at 4.2.</p>
<p><img alt="6sense reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/6sense-ratings.png" /></p>
<p>If you head on over to 3rd party review sites, most of them have a decent view of 6sense. In terms of revenue insights and their predictive analytics, 6sense is particularly solid. Some users have mentioned that 6sense doesn’t have a great UI, citing long loading times and a steep learning curve as a turn off. Tech-savvy users probably won’t have too hard of a time, but the process of setting up the service in the first place has a little bit of a learning curve.</p>
<h3 id="6sense-pricing"><strong>6sense pricing</strong></h3>
<p>We’re back to no transparent pricing on the website, folks.</p>
<p><img alt="6sense's pricing plans" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/6sense-pricing.png" /></p>
<p>I went digging so you don’t have to and so far, it seems prices range from $1000 to $2500 per user, per year. That’s about $80 to $200 a month (give or take a few dollars).</p>
<p>If you’re on the lowest plan, 80 bucks is a decent price. However, if you’re running a small company that needs more users, then things can get a little pricier.</p>
<h3 id="who-should-try-6sense"><strong>Who should try 6sense</strong></h3>
<p>Mid to large sized companies who need a more ABM-focused approach to their sales and marketing. Their buyer intent data and marketing capabilities can help you narrow down exactly where you should be focusing your marketing efforts.</p>
<h2 id="adaptio"><strong>Adapt.io</strong></h2>
<p>Adapt.io says that they have the most extensive and precise industry database. Their repository of contact information is currently at 250M+ B2B contacts and they have the company data of about 10M+ companies, their industry, employee count, and revenue. They’ve also got about 250M of B2B contacts that include emails, mobile numbers, and locations.</p>
<p><img alt="Adapt.io's database of profiles and contact information" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/adapt-data.png" /></p>
<p>Adapt has a more extensive database for technology sectors. If you have a particularly niche sector or type of business you want to deal with, you can probably search for it in their existing database.</p>
<p><img alt="Adapt.io's targeting and identification capabilities" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfHcOl22q1GzdhPqPALLi0BMyBDjIWPWIJRutEWJ8A0KuLDygB_RiE0vqlMAtbcNArl4wG1uO8VMArYjuv79o3JmbxmEvrxiBmO_m-Ji_bBqRz6tk-X1ZmbSQUCEy0plL2NT4eQJMs0qcpEH_GFferH7uVC?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>Adapt.io promises real-time data updates so that you can make better decisions and engage your customers easily. They also claim to have really great customer service on call to answer your questions regardless of time and place.</p>
<h3 id="adaptio-ratings-reviews-405"><strong>Adapt.io ratings &amp; reviews (4.0/5)</strong></h3>
<p>Adapt.io has an average of 4.0 across three platforms. Not too shabby.</p>
<p><img alt="Adapt.io reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/adapt-ratings.png" /></p>
<p>One of the main issues that has been raised is the number of credits in proportion to the price. And given that (like all other platforms) data accuracy and availability can be an issue depending on your industry and geographic location, you might find yourself needing to buy more credits pretty quickly.</p>
<h3 id="adaptio-pricing"><strong>Adapt.io pricing</strong></h3>
<p>You can see an upfront overview of how many credits you get in each plan, starting at $49 a month.</p>
<p><img alt="Adapt.io's pricing plans, starting at $49/month" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/adapt-pricing.png" /></p>
<p>The starter plan is enough for you to dip your toes in and try out their data enrichment plans. It works well enough for smaller businesses and allows them the opportunity to scale up to a custom package later on. However, if I’m being honest, you can get more credits for the same price with other companies. I recommend testing their free option to see if their data accuracy is worth their limited credits.</p>
<h3 id="who-should-try-adaptio"><strong>Who should try Adapt.io</strong></h3>
<p>Mid-sized businesses that want a scalable option for their data enrichment needs. It’s just a little pricey for smaller companies, but a great starting point for those who are already well-established, but want an upgradable option.</p>
<h2 id="linkedin-sales-navigator"><strong>LinkedIn Sales Navigator</strong></h2>
<p>If you’re in the sales and marketing world, you’ve definitely heard of LinkedIn Sales Navigator. It’s designed to help you prospect and build relationships within LinkedIn.</p>
<p>LinkedIn Sales Navigator isn’t one of the end-to-end platforms I’ve introduced in this article so far. They mainly focus on prospecting via advanced search capabilities, then building connections via their real-time insights and InMail Messaging. It sounds a little plain when compared to the comprehensive solutions that other companies provide.</p>
<p><img alt="LinkedIn Sales Navigator database, search, and customer insights" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/Professional Social Network-features.png" /></p>
<p>Anyone who wants the kind of bells and whistles that come with an extensive sales and marketing platform, you can still use LinkedIn Sales Navigator because they have a lot of CRM integrations possible.</p>
<p>Their InMail feature and relationship tracking system sounds quite neat since people are more likely to want to explore a company that has some sort of connection to them, but it might be a hit or miss depending on your niche or industry.</p>
<h3 id="linkedin-sales-navigator-ratings-reviews-445"><strong>LinkedIn Sales Navigator ratings &amp; reviews (4.4/5)</strong></h3>
<p>Beloved by sales professionals all over the world, LinkedIn Sales Navigator averages in at 4.4 on three websites.</p>
<p><img alt="LinkedIn Sales Navigator reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/Professional Social Network-ratings.png" /></p>
<p>I don’t think a lot of people can complain about Sales Navigator. When it comes down to the basics, LinkedIn Sales Navigator does what it says. The only problem is the price point because other B2B data companies provide more with the same price. The fact that every plan gets only 50 InMail messages feels a little criminal to me.</p>
<h3 id="linkedin-sales-navigator-pricing"><strong>LinkedIn Sales Navigator pricing</strong></h3>
<p>If you head to their pricing page, they don’t say much about what it costs, but you can easily unearth their prices elsewhere.</p>
<p><img alt="LinkedIn Sales Navigator pricing" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/Professional Social Network-pricing.png" /></p>
<p>The most basic version of LinkedIn Sales Navigator starts at $99 a month. That’s a little steep for a small business but probably peanuts to someone who’s running a multi-million dollar enterprise.</p>
<p>Their core plan does not come with a lot, but you do get access to their search filters, relationship explorers, and real-time alerts.</p>
<h3 id="who-should-try-linkedin-sales-navigator"><strong>Who should try LinkedIn Sales Navigator</strong></h3>
<p>Mid-sized companies or larger who are targeting large sales numbers every month. For that price point, you can get a cheaper deal with similar leads.</p>
<h2 id="seamlessai"><strong>Seamless.ai</strong></h2>
<p>They call themselves the first and only real-time search engine for B2B sales leads. Seamless has an artificial intelligence search engine that they say can help you build a pipeline or close more deals.</p>
<p><img alt="Seamless.ai's database and ROI." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/seamless-feature-data.png" /></p>
<p>They have a grand total of 1.9B+ contact data (and counting). Granted, the number is a combination of contact data and company profiles, but that’s still a pretty good number.</p>
<p>Seamless primarily uses AI and machine learning to verify the data they get from companies and uses the same AI to help suggest the right prospects for you.</p>
<p><img alt="Seamless.ai's prospecting autopilot" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd0VVv-hrX56yU9Ro2EX2fEX7WWMJNWHye1rhnN-7sGbWV1p7fNLsG3L62khMdihQgj8O2WDX0P81WiVEpAKWpW-HCAsKYdR3pl-arhoCykisWXodDsts9n8DzOVlvJvwWZq3IETdWImFcQv5PNhrhv6No?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>Seamless also offers an AI writing assistant. If you’re new to writing, this assistant can be pretty decent cause it has a prompt library where you can select the type of writing/script that needs to be done. You can also customize the tone of voice and the information that you want to add in their settings feature.</p>
<p>It does take a little bit of time to set up, but it could be pretty useful for people who do a lot of outreach every single day.</p>
<h3 id="seamlessai-ratings-reviews-375"><strong>Seamless.ai ratings &amp; reviews (3.7/5)</strong></h3>
<p>Seamless scores about 3.7 overall. Not the best compared to the other alternatives I’ve listed here.</p>
<p><img alt="Seamless.ai reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/seamless-ratings.png" /></p>
<p>From the look of the reviews, they have a decent database that could be improved. When it comes to the product itself, most of the reviews are quite complimentary. However, some users have expressed their dissatisfaction about the lack of transparency in the contract terms regarding the cancellation period.</p>
<h3 id="seamlessai-pricing"><strong>Seamless.ai pricing</strong></h3>
<p>You can test out Seamless’s free plan to get a taste of what they have to offer. They have 50 credits that you can use to access emails or mobile numbers.</p>
<p><img alt="Seamless.ai pricing plans" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/seamless-pricing.png" /></p>
<p>Did I go digging again? Yes. Recent reviews have mentioned that they paid around $3000-3800 for a year’s subscription, bringing the average to about $316 a month for what appears to be the Pro plan.</p>
<p>Do take note that their Basic plan comes with 250 credits that are refreshed monthly while the Pro plan and above have daily credit refreshes. Their AI writer is also listed as an Add-On that isn’t included in whatever base price you’re quoted.</p>
<h3 id="who-should-try-seamlessai"><strong>Who should try Seamless.ai</strong></h3>
<p>Mid to large enterprises. If you’re a small business thinking of the basic plan, you’re probably better off using other services because you get more bang for your buck with more features. For bigger companies who can afford all the add-ons, Seamless is a pretty decent choice.</p>
<h2 id="leadforensics"><strong>LeadForensics</strong></h2>
<p>LeadForensics leans towards deciphering anonymous website visitors like Leadfeeder and Seamless.</p>
<p>Similarly, they use reverse-IP tracking to match the IPs of website visitors with known company IPs in their database. After they identify who’s been looking at your website, you can use that information to get contact details of these companies and pitch your product in a personalized manner.</p>
<p>If you’ve got an ICP ready, you can upload it to LeadForensics and they’ll send you an alert if someone who fits that ICP visits your website.You can also segment your visitors according to firmographics, making it easier to get a handle on your audience and market.</p>
<p>Where does the contact data come from? Well, LeadForensics gets them from approved third party sources and verifies or enriches them in-house. However, they’re very upfront about not having personally identifying details so if you’re looking for direct personal numbers or emails, this isn’t for you.</p>
<p>LeadForensics is fully GDPR compliant, making them a good choice for businesses who are looking to take things internationally. They don’t have SOC2 Type II certification, but they do have BS EN ISO/ IEC 27001:2017 certification, which means they’ve established, implemented, maintained and are improving their information security management system.</p>
<h3 id="leadforensics-ratings-reviews-415"><strong>LeadForensics ratings &amp; reviews (4.1/5)</strong></h3>
<p>Overall, LeadForensics gets a 4.1 across three sites, which is pretty decent.</p>
<p><img alt="LeadForensics reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/lead-forensics-rating.png" /></p>
<p>According to the existing users, LeadForensics is pretty great at deanonymizing web visitors. It’s got a lot of features, some of which go unused by smaller teams because there’s just too many of them.</p>
<p>However, since they don’t actually have their own database of contact data, you might run into some problems with data accuracy and availability, especially when it comes to global data.</p>
<h3 id="leadforensics-pricing"><strong>LeadForensics pricing</strong></h3>
<p>LeadForensics only has 2 plans at the moment: Essential and Automate.</p>
<p><img alt="LeadForensic's pricing plans" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/leadforensics-pricing.png" /></p>
<p>I went a-looking for prices and found a couple of anecdotes about it being around $260-$500 per month, but then it depends on the volume of your website traffic.</p>
<p>LeadForensics does things a little differently when it comes to customizing packages because your quote will be based on the amount of traffic you see during your free trial. Do be careful about their contract and renewal though, some users have complained about being locked into long contract terms with no way out.</p>
<h3 id="who-should-try-leadforensics"><strong>Who should try LeadForensics</strong></h3>
<p>Mid to large companies looking for a long term website analytics solution and can afford to commit for 3-5 years. If you don’t want the commitment, maybe it’s better to not.</p>
<h2 id="demandbase"><strong>Demandbase</strong></h2>
<p>Demandbase is another Clearbit alternative that gives you access to the identities of your anonymous website visitors, and buyer intent. But not just any intent data, all the intent data. You want Bombora surge? No problem. G2? Sure. TrustRadius? Of course. Use another website for your data? They’ll import it for you.</p>
<p><img alt="Demandbase's Go-to-market Platform" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeIhx-birlrfCFzvdrr8JwPq-6JcGcfyCKJoN9K9lOW8WBbEbo2J6P7qNwxQpKZWIlWERFTaNlDpbT7LZV9_7jBbL93zKwQDmF7aVzw09M7Y56dB5eb7y4TXmKn6nuyjk0myVZXmHeWyozgi23eAt8pUJU?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>They don’t stop there though, they use whatever buying signals or intent data they have, and combine it with artificial intelligence and natural language processing. You can keep track of unlimited keywords relevant to your products or your competitors, in 133 different languages. Multilingual sales intelligence tools are less common but Demandbase is one of them.</p>
<p>DemandBase has 150M+ contacts in 195 countries worldwide, curated by their own AI. They don’t promise any sort of accuracy but they have great search functions where you can search by titles so you can get to decision-makers faster.</p>
<p><img alt="Demandbase's database of profiles and contact information" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/demandbase-data.png" /></p>
<p>Now, DemandBase says that their data is sourced from multiple places and validated through AI and machine learning so it’s supposed to be pretty accurate. If it’s not, you can flag the information as wrong so their fully human team can re-verify the info.</p>
<p>Want to keep up with relevant news? Demandbase makes it easier by putting business-relevant news into your feed so that you can stay up to date with topics like financial decisions, real estate deals, operational changes, and leadership changes. If these don’t appeal to you, no worries. You can set up custom trackers to hunt down the most relevant news for your business and search for specific keywords.</p>
<h3 id="demandbase-ratings-reviews-435"><strong>Demandbase ratings &amp; reviews (4.3/5)</strong></h3>
<p>Demandbase gets an average of 4.3.</p>
<p><img alt="Demandbase reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/demandbase-ratings.png" /></p>
<p>The company does pretty well in terms of getting you intent data and deanonning web visitors. There’s mixed reviews about their reporting, with some people saying that they don’t get enough customization, while others say it’s perfectly fine. While Demandbase does come with numerous CRM integration capabilities, reviews have mentioned that the setup takes time and more tech know-how than an average sales person might have.</p>
<p>Some of the reviews have also mentioned the price point as an issue and ended up having to remove it from their workflow. And despite having 133 languages available, it appears that their data isn’t that great in non-Anglophone areas.</p>
<h3 id="demandbase-pricing"><strong>Demandbase pricing</strong></h3>
<p>Demandbase only does custom packages based on your company’s needs.</p>
<p><img alt="Demandbase's pricing plans" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/demandbase-pricing-2.png" /></p>
<p>Despite my best efforts at unearthing a ballpark figure for you, I must confess the closest I got was $1500 per month for a company of about 200 people. To be very fair, most enterprise plans probably land in the vicinity of that price, but it does deter a lot of smaller companies.</p>
<p>If you have the budget first, their lowest tier does have a nice amount of features like the embedded B2B data, installed tech data, and Plug &amp; Play Partner Integrations. They even cover advertising, making them a great sales and marketing intelligence tool.</p>
<h3 id="who-should-try-demandbase"><strong>Who should try Demandbase</strong></h3>
<p>Mid to large enterprises, with emphasis on the large, who are wholly ready to move into accounts-based marketing. Judging from the reviews and the overall offerings, you pretty much need a solid team to set things up and get things going.</p>
<h2 id="leadiq-405"><strong>LeadIQ (4.0/5)</strong></h2>
<p>LeadIQ monitors your buying signals, gives you B2B data, and then helps you write scripts using AI. They have over 600 million contacts across US, EMEA, and APAC, including verified email addresses, mobile numbers, and technographic data.</p>
<p>The data comes from data partnerships, publicly available information, the contact lists of their own customers, and a proprietary algorithm.</p>
<p><img alt="LeadIQ's data sources" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXctfEa9wuxb2HOsFEFmASLlVkY_SeKEdyY_fy7rJNdL9FWzVkc9Ja_Knbhw-ciESGwNl_YVPM19HadBm8GtrNOSDJGaHFWTZ8feQuC-0vZIHmRyYEvqHh5JpZRkcAZB5roPMbkOzwbgPGNBwOvFvWhar9zq?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>The data is verified through a series of checks like their data partner’s own evaluation, followed by real-time verification and then their algorithm. They also rely on LeadIQ’s own users to flag and edit any incorrect contact data, which they’ll re-verify. Some of their data is refreshed and verified in real-time, but I couldn’t find a promise of how fresh their contact information is going to be.</p>
<p>Like other platforms that gather community data, LeadIQ promises only to retrieve data that’s typically found on business cards. They are fully GDPR compliant and users can request that their information be removed at any time.</p>
<p>LeadIQ also has a writing assistant called Scribe. You can get it to generate cold emails or pitches for you. Even their free tier lets you test out the email generations, which is pretty nifty to me.</p>
<p><img alt="LeadIQ's AI writing assistant, Scribe." src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcPVh3lwy0kBYsKc7j20SQBMTd6hR5cj4vUpBCVFmfEsxzSU_AFQUA7Fgu8uFVLTuJmKuFa_h6aGpa2sefJOS2fxFvr0Vqlpw_OXjahnCQ_sag5o_oa2gHBW3XvT0h3ohfP2lBbpGUo3iAJmtDK786-CuPu?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<p>Not only does it take prompts, you can change the value proposition to personalize the email further for specific decision-makers.</p>
<h3 id="leadiq-ratings-reviews-405"><strong>LeadIQ ratings &amp; reviews (4.0/5)</strong></h3>
<p>At 4.0 out of 5, LeadIQ is a pretty well-received Clearbit alternative.</p>
<p><img alt="LeadIQ reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/leadiq-ratings.png" /></p>
<p>The general sentiment is that it does really well if you’re using it in conjunction with LinkedIn Sale Navigator. Not that it doesn’t work without LinkedIn, but just that it might work slower. If you’re prospecting from LinkedIn, there have been complaints that the sync rate is pretty slow, which is frustrating if you’re looking for hundreds of prospects a day.</p>
<h3 id="leadiq-pricing"><strong>LeadIQ pricing</strong></h3>
<p>You can get the lowest tier of LeadIq at $45 per month, per user.</p>
<p><img alt="LeadIQ's pricing plans, starting at $45/month/user" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/leadiq-pricing.png" /></p>
<p>Their Essentials plan gives you 1000 verified emails and 50 mobile numbers. It’s a decent starting point for any small business starting to do sales outreach. The expense ramps up quickly if you start adding seats, but for smaller companies who might only have one person in sales, it’s good enough.</p>
<h3 id="who-should-try-leadiq"><strong>Who should try LeadIQ</strong></h3>
<p>Small to mid-sized companies in their first leg of sales intelligence. It’s got enough to get you off the ground and start running, but not too expensive that it breaks the bank.</p>
<h2 id="fullcontact"><strong>FullContact</strong></h2>
<p>FullContact boasts 248M people profiles in North America and 200M updates every single day. Not only that, they track 50B identifiers across 10 different categories to produce comprehensive people profiles.</p>
<p><img alt="FullContact's database of profiles and contact information" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/fullcontact-data.png" /></p>
<p>They have access to 224M phone numbers and 125M business emails alone. If I include personal emails, the amount of contact information in their database is doubled. Fullcontact is partnered with Fideo, a company that verifies contact information to protect you from fraud and identity crimes. Basically, whenever you retrieve information, the FullContact platform pulls the data from Fideo through an API and verifies it on the spot.</p>
<p><img alt="FullContact's partner, Fideo that verifies identities and prevents fraud." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/fullcontact-feature-fideo-intent.png" /></p>
<p>FullContact links bits of identifiers to a person and assigns them a unique Person ID to create an identity graph. The data is gathered from places like public websites (social media) or business cards (transcribed by humans) and appended to your existing contact database. If you already have a bunch of contacts, you can import them via Excel. Coupled with Google and Yahoo integration, FullContact does a lot to give you a comprehensive profile of a person.</p>
<p><img alt="FullContact's Identity resolution graph." src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/fullcontact-feature-resolve.png" /></p>
<p>One interesting thing I noted while looking up FullContact was their Mobile Ad IDs aka MAIDs. These IDs track the type of ads that people open on their mobile devices, which makes it easier to figure out user behavior and activity. Useful for segmentation, in my opinion.</p>
<p><img alt="FullContact's Mobile Ad Identification." src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfbq4JKUf8kan2_B2ike65T1ITnXFucTZE4ogC7-ck86edooW9z67sDeCC-2Vx5iD8_laUJTFangRH_UGIr0QFICzXBqXHrtPiDGjrL2XGA1q-X-Z7U-PoH_DC_RJdAgmHjIX7HASjujscRM5cphtoKX21g?key=1c3B0mSdyL6BIr9N-JhFRA" /></p>
<h3 id="fullcontact-ratings-reviews-415"><strong>FullContact ratings &amp; reviews (4.1/5)</strong></h3>
<p>FullContact comes in at an average of 4.1.</p>
<p><img alt="FullContact reviews from G2, Capterra, Trustradius" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/fullcontact-ratings.png" /></p>
<p>In general, it does great with contacts and people like the fact that the information is being refreshed daily. The extension grabs information pretty quickly and accurately, which is a huge plug point.</p>
<p>Unfortunately, a common complaint from users is that the mobile app is kind of buggy and the platform takes some time to sync. The waiting time is quite tedious if a company wants to sync or export thousands of profiles at a time. Though the extension has a bit of a learning curve, don’t let that deter you from using it.</p>
<h3 id="fullcontact-pricing"><strong>FullContact pricing</strong></h3>
<p>There are three plans available for prospective customers of FullContact, the lowest price being $99 per month.</p>
<p><img alt="FullContact's pricing plans, starting at $99/month" src="https://nubela-blog.sgp1.digitaloceanspaces.com/sapiengraph-live/2024/09/fullcontact-pricing.png" /></p>
<p>The essentials plan gives you pretty much everything you need for basic lead generation if you’re a small to mid-sized company. You get enough browsing analytics and just enough leads to not overwhelm the team on the essentials plan. I also like that the $99 comes with 3 seats right off the bat.</p>
<h3 id="who-should-try-fullcontact"><strong>Who should try FullContact?</strong></h3>
<p>Smaller teams who want to identify and contact their website visitors without breaking the bank, or companies who are scaling up really rapidly and want to hit massive KPIs.</p>
<h2 id="tldr-features-list"><strong>TL;DR Features List</strong></h2>
<p>At this point I will be blamed if I didn’t create a nice big table telling you what each platform has. But if I put in an extensive list of features, this article would become uncomfortably long (and wide) so I’m just going to give you the top ones like AI writing assistants, API access, privacy compliance, and also buyer intent. Have fun.</p>
<table>
<thead>
<tr>
<th>Features</th>
<th>Account Based Marketing</th>
<th>AI Writing Assistant</th>
<th>API available</th>
<th>Browser Extension</th>
<th>CCPA Compliant</th>
<th>GDPR Compliant</th>
<th>Human Verification</th>
<th>Inbuilt Dialer</th>
<th>Intent Data</th>
<th>IP Intelligence</th>
</tr>
</thead>
<tbody>
<tr>
<td>Clearbit / Breeze Intelligence</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
</tr>
<tr>
<td>Proxycurl</td>
<td></td>
<td></td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Sapiengraph</td>
<td></td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>NinjaPear</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ZoomInfo</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
</tr>
<tr>
<td>Apollo.io</td>
<td></td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
</tr>
<tr>
<td>Cognism</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td></td>
</tr>
<tr>
<td>Lusha</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td></td>
</tr>
<tr>
<td>Lead411</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td></td>
</tr>
<tr>
<td>UpLead</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td>✔️</td>
<td></td>
</tr>
<tr>
<td>RocketReach</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Leadfeeder</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
</tr>
<tr>
<td>6sense</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Adapt.io</td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>LinkedIn Sales Navigator</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Seamless.ai</td>
<td></td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td>✔️</td>
<td></td>
</tr>
<tr>
<td>LeadForensics</td>
<td></td>
<td></td>
<td>✔️</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td>✔️</td>
</tr>
<tr>
<td>Demandbase</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td>✔️</td>
<td></td>
</tr>
<tr>
<td>LeadIQ</td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>FullContact</td>
<td></td>
<td></td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td>✔️</td>
<td></td>
<td></td>
<td></td>
<td>✔️</td>
</tr>
</tbody>
</table>
<h2 id="conclusion"><strong>Conclusion</strong></h2>
<p>Last thoughts: a huge database doesn't mean quality data, and live updates aren't a guarantee of accuracy.</p>
<p>If you came here specifically looking for Proxycurl or Sapiengraph, the honest answer is that both products have been sunset. I’m not going to play pretend and write around that.</p>
<p>The founder behind them is now building NinjaPear, and if what you want is B2B data plus actual market intelligence, that’s where I’d point you first. If you want a giant all-in-one enterprise suite, look harder at ZoomInfo, 6sense, or Demandbase. If you want a more affordable sales-first option, Apollo.io, LeadIQ, and Lusha are easier places to start.</p>
<p>That said, give NinjaPear a whirl before committing to one of the heavier platforms. If your team cares about competitor moves, customer discovery, and timing your outreach around real change, not just static enrichment, it’s the most interesting option on this list.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Your Network, Your Rewards: Earn with Our New Referral Program ]]></title>
        <description><![CDATA[ Good news: Proxycurl finally has a referral program! Here&#39;s how to use it. ]]></description>
        <link>https://nubela.co/blog/proxycurl-referral-program/</link>
        <guid isPermaLink="false">66e30ada14d5160001577e1e</guid>
        <category><![CDATA[ referral program ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Fri, 13 Sep 2024 00:07:08 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>After several different iterations of our referral program over the years—and many requests to bring it back—I’m happy to announce that it’s finally here again.</p>
<p>Now, you can earn commissions by referring your friends or business associates to us.</p>
<p>Specifically, you can earn 25% of a referral's revenue, up to a maximum of $3,000 (including recurring payments), with no caps on how many people you can refer.</p>
<p>If that caught your attention, here's how to join and earn commissions:</p>
<h1 id="joining-our-referral-program">Joining our referral program</h1>
<p>First, to join our referral program you simply need to first create your Proxycurl account <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">here</a>, then login to the dashboard <a href="https://nubela.co/proxycurl/auth/login?ref=nubela.co">here</a>.</p>
<h1 id="how-to-use-our-referral-program">How to use our referral program</h1>
<p>After that, you'll see this little widget on the side of all of the pages on our website, or the dashboard:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/09/ref1.png" class="kg-image" alt="What the referral program widget looks like" loading="lazy" width="2000" height="1137"><figcaption><span style="white-space: pre-wrap;">What the referral program widget looks like</span></figcaption></figure><p>(<strong>Note:</strong> Temporarily this doesn't work on the blog, but it'll be fixed soon.)</p>
<h1 id="receiving-your-referral-link">Receiving your referral link</h1>
<p>Once you click on it, you'll see this overlay appear:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/09/ref2.png" class="kg-image" alt="Your referral link" loading="lazy" width="614" height="596"><figcaption><span style="white-space: pre-wrap;">Your referral link</span></figcaption></figure><p>This is the link you'll need to share to earn comissions for your referrals, and it'll be synced to your Proxycurl account.</p>
<h1 id="cash-out-the-big-bucks">Cash out the big bucks</h1>
<p>Ka-ching! Once you've earned some comissions, you can cash out either via PayPal, or Venmo through the referral widget (this depends on your country, and these payment methods may be changed in the future):</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/09/ref3.png" class="kg-image" alt="Getting paid out for referrals" loading="lazy" width="623" height="592"><figcaption><span style="white-space: pre-wrap;">Getting paid out for referrals</span></figcaption></figure><h1 id="easy-peasy-lemon-squeezy">Easy-peasy, lemon squeezy</h1>
<p>It takes 1 minute max to join our referral program, and that's if you're not already a user.</p>
<p>Long story short, if you know a few developers or businesses that might want access to practically infinite amounts of rich and fresh B2B data, we'd love to make you some money ;-).</p>
<p>Thanks for reading!</p>
<p></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ You Can Now Add Team Members to Your Proxycurl Account ]]></title>
        <description><![CDATA[ You&#39;ve been asking for this for a while, and we&#39;ve finally delivered... ]]></description>
        <link>https://nubela.co/blog/add-team-members-proxycurl/</link>
        <guid isPermaLink="false">66c3c78bdead420001d51ee5</guid>
        <category><![CDATA[ team members ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Wed, 28 Aug 2024 22:10:34 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>After many requests, some coding, and <s>blood, sweat, and tears</s> caffeine, the wait is finally over: you can now add team members to your Proxycurl account.</p>
<p>That said, in this article, you'll learn:</p>
<ul>
<li>What plans have the ability to create a team (and if not, how to upgrade)</li>
<li>How to add and manage team members</li>
<li>The different roles of team members and what they can do</li>
</ul>
<p>First things first:</p>
<h2 id="what-plans-have-the-ability-to-create-a-team">What plans have the ability to create a team?</h2>
<p>All plans except our monthly "Starter" plan can create a team. <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">You can view our plans here</a>.</p>
<p>This means that even on the "Starter" plan you can create a team if you opt for annual billing.</p>
<p>So, really, you should ask: what plans don't have the ability to create a team?</p>
<h2 id="how-to-create-your-first-team">How to create your first team</h2>
<p>If you log into the <a href="https://nubela.co/proxycurl/dashboard?ref=nubela.co">Proxycurl dashboard</a>, you should see this link on the left navigation bar:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-0.png" class="kg-image" alt="Accessing the teams feature" loading="lazy" width="184" height="222"><figcaption><span style="white-space: pre-wrap;">Accessing the teams feature</span></figcaption></figure><p>Once clicked, you'll be redirected to <a href="https://nubela.co/proxycurl/dashboard/teams/?ref=nubela.co">our team's page</a> where you can either upgrade your account (if you're on a monthly "Starter" plan):</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-1.png" class="kg-image" alt="The account upgrade page" loading="lazy" width="1731" height="600"><figcaption><span style="white-space: pre-wrap;">The account upgrade page</span></figcaption></figure><p>Or, if you're already on an eligible plan, click the "Get started" button:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-2.png" class="kg-image" alt="Creating your team" loading="lazy" width="1515" height="320"><figcaption><span style="white-space: pre-wrap;">Creating your team</span></figcaption></figure><p>You'll then be asked to pick your team name:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-4-1.png" class="kg-image" alt="Picking your team name" loading="lazy" width="395" height="256"><figcaption><span style="white-space: pre-wrap;">Picking your team name</span></figcaption></figure><p>After that, you're now the proud owner of a Proxycurl team!</p>
<h2 id="how-to-invite-team-members">How to invite team members</h2>
<p>After creating your team, you can click the "Invite member" button on the <a href="https://nubela.co/proxycurl/dashboard/teams/?ref=nubela.co">team's page</a> to invite your team members:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-3-1.png" class="kg-image" alt="Inviting team members" loading="lazy" width="1709" height="216"><figcaption><span style="white-space: pre-wrap;">Inviting team members</span></figcaption></figure><p>It's a very simple process all done with an email:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-4-2.png" class="kg-image" alt="Emailing the invite" loading="lazy" width="251" height="199"><figcaption><span style="white-space: pre-wrap;">Emailing the invite</span></figcaption></figure><p>All they need to do is click the link sent via email by us. They'll then be asked to create their account and automatically added to your team.</p>
<h2 id="managing-your-team">Managing your team</h2>
<p>There are really only two main actions you can do in regard to your team members, which are to make an individual an admin or remove them:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-12.png" class="kg-image" alt="Managing your team members" loading="lazy" width="1726" height="299"><figcaption><span style="white-space: pre-wrap;">Managing your team members</span></figcaption></figure><p>If an individual is an admin, they'll also have the ability to make others admins or remove team members (but not team owners).</p>
<h2 id="what-can-you-do-with-a-team">What can you do with a team?</h2>
<p>The main benefit is that of course you'll no longer have to share your account with your other team members.</p>
<p>You, or anyone on your team will have the ability to generate additional API keys and you can individually track the credit consumption for each API key or export the logs per key.</p>
<p>Do note that if you create a team, your account's API keys are shared with your team members. So only invite actual trusted team members.</p>
<h2 id="how-to-add-additional-team-api-keys">How to add additional team API keys</h2>
<p>As team keys are shared from the team owner's account, the team owner can add additional keys by simply going to the <a href="https://nubela.co/proxycurl/dashboard/proxycurl-api/api-key/?ref=nubela.co">API keys page</a>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-10.png" class="kg-image" alt="Adding new team API keys" loading="lazy" width="1735" height="566"><figcaption><span style="white-space: pre-wrap;">Adding new team API keys</span></figcaption></figure><p>Your team members will also have the ability to view your credits available or top up with the team owner's payment method on file.</p>
<p>Team members can also create their own team keys, but the process is slightly different. They need to switch to the team in context first from their API logs page.</p>
<p>Here's how:</p>
<h2 id="switching-between-personal-api-keys-and-team-api-keys-as-a-team-member">Switching between personal API keys and team API keys as a team member</h2>
<p>If your account is a member of a team, you can still use any keys of any teams you're a part of, or you can use your own personal key.</p>
<p>Once on <a href="https://nubela.co/proxycurl/dashboard/proxycurl-api/api-key/?ref=nubela.co">the API key page</a>, just use the drop-down in the top left to switch:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/08/upgrade-11-use.png" class="kg-image" alt="Switching between keys" loading="lazy" width="1729" height="493"><figcaption><span style="white-space: pre-wrap;">Switching between keys</span></figcaption></figure><p>You can then add API keys as a team member shown exactly the same way as a team owner above.</p>
<h2 id="conclusion">Conclusion</h2>
<p>The ability to add team members and give them their own API keys with trackable billing and isolated control of your Proxycurl account is finally here.</p>
<p>All plans except our smallest monthly "Starter" plan are eligible for it, and you can create your team or upgrade your account <a href="https://nubela.co/proxycurl/dashboard/teams/?ref=nubela.co">right here</a>.</p>
<p>If you don't already have an account and you're looking for reliable, rich, and fresh B2B data, we would be more than happy to have you, and <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">you can create your account for free here</a>.</p>
<p>Thanks for reading, and keep an eye out on <a href="https://nubela.co/blog/">our blog</a> for future updates and more!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ 13 Best Data Enrichment Tools in 2026 ]]></title>
        <description><![CDATA[ The 13 best data enrichment tools currently available on the market in 2024. ]]></description>
        <link>https://nubela.co/blog/best-data-enrichment-tools/</link>
        <guid isPermaLink="false">666cb6c838fd8100017ffa9d</guid>
        <category><![CDATA[ data enrichment tools ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Tue, 13 Aug 2024 18:40:43 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_403.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Data enrichment tools are not all solving the same problem.</p>
<p>Some are basically email finders with a nicer landing page. Some are contact databases with a Chrome extension bolted on. Some are actual enrichment infrastructure. If you're trying to choose the right <strong>data enrichment tools</strong> in 2026, the short version is this: pick based on workflow first, not brand.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Playful-Analyst6425</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">We have been actively using Apollo for nine months now. The the quality of data is not great for the past few months. Now we are looking to change the stack.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1htl81j/recommendation_for_email_and_phone_enrichment_tool/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is the real buying context. Not "what is data enrichment?" You already know what it is. You want to know which tool fits your stack, your budget, and your tolerance for bad data.</p>
<p>Businesses use data enrichment tools to do two things:</p>
<ul>
<li>source new prospecting data</li>
<li>fill gaps in an existing prospect or customer dataset</li>
</ul>
<p>There are quite a few of them now, and they serve very different buyers.</p>
<p>So the better question is not "what is the best data enrichment tool?" It is: <strong>what kind of enrichment are you actually buying?</strong></p>
<h2 id="1-proxycurl">1. Proxycurl</h2>
<p><img alt="Proxycurl's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de1.png" /></p>
<p>Proxycurl's homepage</p>
<p><a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> was a B2B enrichment API that specialized in people, jobs, and companies.</p>
<p>It provided a wide range of information, including job titles, company details, social media profiles, contact information, and beyond through its API.</p>
<h3 id="how-to-enrich-people-with-proxycurl">How to enrich people with Proxycurl</h3>
<p>Enriching people could be as easy as querying the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api">Person Profile Endpoint</a>, with a cURL command, such as:</p>
<pre><code class="language-curl">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/v2/linkedin' \
    --data-urlencode 'linkedin_profile_url=https://linkedin.com/in/johnrmarty/' \
    --data-urlencode 'extra=include' \
    --data-urlencode 'github_profile_id=include' \
    --data-urlencode 'facebook_profile_id=include' \
    --data-urlencode 'twitter_profile_id=include' \
    --data-urlencode 'personal_contact_number=include' \
    --data-urlencode 'personal_email=include' \
    --data-urlencode 'inferred_salary=include' \
    --data-urlencode 'skills=include' \
    --data-urlencode 'use_cache=if-recent' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>Which would enrich an individual with their LinkedIn profile URL, but you could also use X or Facebook.</p>
<p>Here's an example of what it would return:</p>
<pre><code class="language-json">{
  &quot;public_identifier&quot;: &quot;johnrmarty&quot;,
  &quot;profile_pic_url&quot;: &quot;string&quot;,
  &quot;background_cover_image_url&quot;: &quot;string&quot;,
  &quot;first_name&quot;: &quot;string&quot;,
  &quot;last_name&quot;: &quot;string&quot;,
  &quot;full_name&quot;: &quot;string&quot;,
  &quot;follower_count&quot;: &quot;integer&quot;,
  &quot;occupation&quot;: &quot;string&quot;,
  &quot;headline&quot;: &quot;string&quot;,
  &quot;summary&quot;: &quot;string&quot;,
  &quot;country&quot;: &quot;string&quot;,
  &quot;country_full_name&quot;: &quot;string&quot;,
  &quot;city&quot;: &quot;string&quot;,
  &quot;state&quot;: &quot;string&quot;,
  &quot;experiences&quot;: [
    {
      &quot;starts_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;ends_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;company&quot;: &quot;string&quot;,
      &quot;company_linkedin_profile_url&quot;: &quot;string&quot;,
      &quot;company_facebook_profile_url&quot;: &quot;string&quot;,
      &quot;title&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;,
      &quot;location&quot;: &quot;string&quot;,
      &quot;logo_url&quot;: &quot;string&quot;
    }
  ],
  &quot;education&quot;: [
    {
      &quot;starts_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;ends_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;field_of_study&quot;: &quot;string&quot;,
      &quot;degree_name&quot;: &quot;string&quot;,
      &quot;school&quot;: &quot;string&quot;,
      &quot;school_linkedin_profile_url&quot;: &quot;string&quot;,
      &quot;school_facebook_profile_url&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;,
      &quot;logo_url&quot;: &quot;string&quot;,
      &quot;grade&quot;: &quot;string&quot;,
      &quot;activities_and_societies&quot;: &quot;string&quot;
    }
  ],
  &quot;languages&quot;: [
    &quot;string&quot;
  ],
  &quot;accomplishment_organisations&quot;: [
    {
      &quot;name&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;,
      &quot;url&quot;: &quot;string&quot;
    }
  ],
  &quot;accomplishment_publications&quot;: [
    {
      &quot;title&quot;: &quot;string&quot;,
      &quot;publication&quot;: &quot;string&quot;,
      &quot;url&quot;: &quot;string&quot;
    }
  ],
  &quot;accomplishment_honors_awards&quot;: [
    {
      &quot;title&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;
    }
  ],
  &quot;accomplishment_patents&quot;: [
    {
      &quot;title&quot;: &quot;string&quot;,
      &quot;patent_number&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;
    }
  ],
  &quot;accomplishment_courses&quot;: [
    {
      &quot;title&quot;: &quot;string&quot;,
      &quot;provider&quot;: &quot;string&quot;,
      &quot;url&quot;: &quot;string&quot;
    }
  ],
  &quot;accomplishment_projects&quot;: [
    {
      &quot;starts_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;ends_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;title&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;,
      &quot;url&quot;: &quot;string&quot;
    }
  ],
  &quot;accomplishment_test_scores&quot;: [
    {
      &quot;test_name&quot;: &quot;string&quot;,
      &quot;score&quot;: &quot;integer&quot;,
      &quot;date&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      }
    }
  ],
  &quot;volunteer_work&quot;: [
    {
      &quot;starts_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;ends_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;title&quot;: &quot;string&quot;,
      &quot;cause&quot;: &quot;string&quot;,
      &quot;company&quot;: &quot;string&quot;,
      &quot;company_linkedin_profile_url&quot;: &quot;string&quot;,
      &quot;description&quot;: &quot;string&quot;,
      &quot;logo_url&quot;: &quot;string&quot;
    }
  ],
  &quot;certifications&quot;: [
    {
      &quot;starts_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;ends_at&quot;: {
        &quot;day&quot;: &quot;integer&quot;,
        &quot;month&quot;: &quot;integer&quot;,
        &quot;year&quot;: &quot;integer&quot;
      },
      &quot;name&quot;: &quot;string&quot;,
      &quot;license_number&quot;: &quot;string&quot;,
      &quot;display_source&quot;: &quot;string&quot;,
      &quot;authority&quot;: &quot;string&quot;,
      &quot;url&quot;: &quot;string&quot;
    }
  ],
  &quot;connections&quot;: &quot;integer&quot;,
  &quot;people_also_viewed&quot;: [
    {
      &quot;link&quot;: &quot;string&quot;,
      &quot;name&quot;: &quot;string&quot;,
      &quot;summary&quot;: &quot;string&quot;,
      &quot;location&quot;: &quot;string&quot;
    }
  ]
}
</code></pre>
<p>Additionally, a social media profile URL was not the only possible method to enrich a person's profile. You could also use the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api">Search API</a> with a name or company, or use solely an email and beyond.</p>
<p>For all options, <a href="https://nubela.co/proxycurl/docs?ref=nubela.co">it's best to take a look at the documentation</a>.</p>
<p>We also released a <a href="https://www.youtube.com/watch?v=bxf3uKdcCo8&ref=nubela.co">YouTube video</a> explaining how LinkedIn profile scraping worked, both individually and in bulk, including the Python code used.</p>
<blockquote>
<p><strong>Update for 2026:</strong> Proxycurl has been sunset. The founder behind Proxycurl and Sapiengraph is now building NinjaPear instead. I am retaining this section because a lot of buyers still search for Proxycurl by name, and because the API-first way of thinking here still matters. But if you're evaluating vendors today, look at NinjaPear, not Proxycurl.</p>
</blockquote>
<p>💡</p>
<p><strong>Note:</strong> You can still browse the old <a href="https://nubela.co/proxycurl/docs?ref=nubela.co">Proxycurl documentation</a> for historical reference.</p>
<h3 id="how-to-enrich-companies-with-proxycurl">How to enrich companies with Proxycurl</h3>
<p>The only thing that changed here was the endpoint, which would be the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api">Company Profile Endpoint</a> instead.</p>
<p>Here's another example using cURL:</p>
<pre><code class="language-curl">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/linkedin/company' \
    --data-urlencode 'url=https://www.linkedin.com/company/google/' \
    --data-urlencode 'resolve_numeric_id=true' \
    --data-urlencode 'categories=include' \
    --data-urlencode 'funding_data=include' \
    --data-urlencode 'exit_data=include' \
    --data-urlencode 'acquisitions=include' \
    --data-urlencode 'extra=include' \
    --data-urlencode 'use_cache=if-recent' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>As you can see above we're using a LinkedIn company URL, and it would return something similar to this:</p>
<pre><code class="language-json">{
  &quot;linkedin_internal_id&quot;: &quot;1441&quot;,
  &quot;description&quot;: &quot;Google builds products...&quot;,
  &quot;website&quot;: &quot;https://goo.gle/3DLEokh&quot;,
  &quot;industry&quot;: &quot;Software Development&quot;,
  &quot;company_size&quot;: [10001, null],
  &quot;hq&quot;: {
    &quot;country&quot;: &quot;US&quot;,
    &quot;city&quot;: &quot;Mountain View&quot;,
    &quot;state&quot;: &quot;CA&quot;
  },
  &quot;company_type&quot;: &quot;PUBLIC_COMPANY&quot;,
  &quot;specialities&quot;: [&quot;search&quot;, &quot;ads&quot;, &quot;mobile&quot;, &quot;android&quot;],
  &quot;locations&quot;: [{&quot;country&quot;: &quot;US&quot;, &quot;city&quot;: &quot;Mountain View&quot;, &quot;state&quot;: &quot;CA&quot;}],
  &quot;name&quot;: &quot;Google&quot;,
  &quot;profile_pic_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile...&quot;,
  &quot;background_cover_image_url&quot;: &quot;https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover...&quot;,
  &quot;similar_companies&quot;: [{&quot;name&quot;: &quot;YouTube&quot;, &quot;link&quot;: &quot;https://www.linkedin.com/company/youtube&quot;}],
  &quot;affiliated_companies&quot;: [{&quot;name&quot;: &quot;YouTube&quot;, &quot;link&quot;: &quot;https://www.linkedin.com/company/youtube/&quot;}],
  &quot;follower_count&quot;: 33125306,
  &quot;acquisitions&quot;: {&quot;acquired&quot;: [{&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/siemplify&quot;}]},
  &quot;exit_data&quot;: [{&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/company/jd.com&quot;}],
  &quot;extra&quot;: {
    &quot;crunchbase_profile_url&quot;: &quot;https://www.crunchbase.com/organization/google&quot;,
    &quot;ipo_status&quot;: &quot;Public&quot;,
    &quot;contact_email&quot;: &quot;google@google.com&quot;,
    &quot;phone_number&quot;: &quot;+16502530000&quot;,
    &quot;stock_symbol&quot;: &quot;NASDAQ:GOOGL&quot;
  },
  &quot;funding_data&quot;: [{&quot;funding_type&quot;: &quot;Angel Round&quot;, &quot;money_raised&quot;: 1000000}],
  &quot;categories&quot;: [&quot;advertising&quot;, &quot;collaboration&quot;, &quot;enterprise-software&quot;]
}
</code></pre>
<p>Of course, like pulling person B2B data, there were alternative ways to pull company data such as the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-company-search-endpoint">Company Search Endpoint</a>.</p>
<p>Anyway, now that you know a bit about the two most commonly used API endpoints, I'll carry on.</p>
<h3 id="pros">Pros</h3>
<ul>
<li>Comprehensive data coverage for both individuals and companies</li>
<li>An extensive amount of data is available</li>
<li>Provides job-based data</li>
<li>Provides contact information</li>
<li>Can scrape in real time</li>
<li>Competitive pricing</li>
<li>GDPR &amp; CCPA compliant</li>
<li>Easy integration with existing systems</li>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co">Detailed and well-maintained documentation</a></li>
</ul>
<h3 id="cons">Cons</h3>
<ul>
<li>It may not cover every profile you try depending on the privacy settings of the individual you're trying to enrich</li>
<li>It has been sunset, so this is now mostly useful as historical context</li>
</ul>
<h3 id="pricing">Pricing</h3>
<p>Proxycurl historically offered free credits upon account creation as well as pay-as-you-go and subscription plans. Plans started at $49/month.</p>
<h3 id="best-for">Best for</h3>
<p>Developers researching the API-first lineage of this category, or teams comparing older enrichment APIs to newer vendors.</p>
<h2 id="2-ninjapear">2. NinjaPear</h2>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is the spiritual successor here, but it is not just a Proxycurl rebrand.</p>
<p>That distinction matters.</p>
<p>NinjaPear still does enrichment, but the product direction is broader: company profiles, person profiles, work email finding, employee count, customer discovery, competitor mapping, and monitoring company changes across blogs, X, and websites. In other words, it is trying to answer a bigger GTM question than "what is this person's email?"</p>
<p>If all you need is a browser plugin to grab a phone number, NinjaPear is probably more product than you need. If you're building workflows around account research, prospecting, or competitive intelligence, it starts to make more sense.</p>
<p>A few concrete details from the current product:</p>
<ul>
<li>3-day free trial</li>
<li>10 credits included</li>
<li>no credit card required</li>
<li>API products include Customer API, Company API, Employee API, Monitor API, and Competitor API</li>
<li>there is also <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>, which is basically a spreadsheet interface for list building and enrichment</li>
<li>there is also <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a>, which turns company changes into an RSS feed</li>
</ul>
<h3 id="pros_1">Pros</h3>
<ul>
<li>Broader than standard enrichment, includes customer and competitor data</li>
<li>API-first, but also usable through spreadsheets and AI workflows</li>
<li>No monthly minimums, usage-based pricing</li>
<li>Free company logo API</li>
<li>Useful if you care about company changes, not just static firmographics</li>
</ul>
<h3 id="cons_1">Cons</h3>
<ul>
<li>Overkill if you only need a lightweight email finder</li>
<li>Newer category position means buyers need to understand the product shape first</li>
</ul>
<h3 id="pricing_1">Pricing</h3>
<p>NinjaPear offers a 3-day free trial with 10 credits included and no credit card required. Paid usage is credit-based and pay-as-you-go, with subscription options on the pricing page.</p>
<h3 id="best-for_1">Best for</h3>
<p>Teams that want enrichment plus competitive intelligence on the same platform.</p>
<h2 id="3-sapiengraph">3. Sapiengraph</h2>
<p><img alt="Sapiengraph's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/sapiengraph.png" /></p>
<p>Sapiengraph's homepage</p>
<p><a href="https://www.sapiengraph.com/?ref=nubela.co">Sapiengraph</a> was a Google Sheets B2B data enrichment extension. It let you pull B2B data such as work history, emails, phone numbers, and more, all within a spreadsheet.</p>
<h3 id="pros_2">Pros</h3>
<ul>
<li>Direct integration with Google Sheets</li>
<li>Extensive data points</li>
<li>Fresh and accurate data</li>
<li>GDPR &amp; CCPA compliant</li>
<li>No-code and low-tech friendly</li>
</ul>
<h3 id="cons_2">Cons</h3>
<ul>
<li>May not cover all profiles depending on privacy settings</li>
<li>No longer the active focus of the founder behind the product line</li>
</ul>
<h3 id="pricing_2">Pricing</h3>
<p>Sapiengraph historically had a free trial and plans starting at $49 per month.</p>
<h3 id="best-for_2">Best for</h3>
<p>Teams researching spreadsheet-native enrichment tools, especially if they came here looking for the old Sapiengraph product.</p>
<h2 id="4-kaspr">4. Kaspr</h2>
<p><img alt="Kaspr's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/kaspr.png" /></p>
<p>Kaspr's homepage</p>
<p><a href="https://kaspr.io/?ref=nubela.co">Kaspr</a> focuses on enriching phone numbers, email addresses, company info and more, often through its Chrome extension.</p>
<h3 id="pros_3">Pros</h3>
<ul>
<li>Data verified against 150 sources</li>
<li>Extensive database</li>
<li>Chrome integration</li>
<li>GDPR compliant</li>
<li>Low-tech friendly</li>
</ul>
<h3 id="cons_3">Cons</h3>
<ul>
<li>Limited free credits</li>
<li>It can get pricey at scale</li>
</ul>
<h3 id="pricing_3">Pricing</h3>
<p>Has a free trial, then starts at $49 per month billed annually.</p>
<h3 id="best-for_3">Best for</h3>
<p>Low-tech sales teams needing contact details fast.</p>
<h2 id="5-hunterio">5. Hunter.io</h2>
<p><img alt="Hunter's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/hunter.png" /></p>
<p>Hunter's homepage</p>
<p><a href="https://hunter.io/?ref=nubela.co">Hunter.io</a> specializes in finding B2B leads and enriching them. Its simple interface, email finder, verifier, and CRM integrations make it popular for one very specific reason: it is easy.</p>
<p>That simplicity is both the strength and the limitation. If all you want is professional email discovery and verification, Hunter is still a very sane choice. If you want deeper person or company enrichment, you will hit the ceiling pretty quickly.</p>
<h3 id="pros_4">Pros</h3>
<ul>
<li>Simple interface</li>
<li>Email finder and verifier</li>
<li>CRM integration</li>
<li>Built-in B2B lead finder</li>
<li>GDPR compliant</li>
</ul>
<h3 id="cons_4">Cons</h3>
<ul>
<li>Limited data points available</li>
</ul>
<h3 id="pricing_4">Pricing</h3>
<p>The free plan is limited to 25 searches per month.</p>
<p>Paid plans start at $34/month when billed annually.</p>
<h3 id="best-for_4">Best for</h3>
<p>Finding professional email addresses quickly and easily.</p>
<h2 id="6-uplead">6. UpLead</h2>
<p><img alt="UpLead's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/uplead.png" /></p>
<p>UpLead's homepage</p>
<p><a href="https://www.uplead.com/?ref=nubela.co">UpLead</a> offers B2B contact data with real-time email verification and CRM integration.</p>
<h3 id="pros_5">Pros</h3>
<ul>
<li>High-quality B2B contact data with real-time verification</li>
<li>Access to 155M+ leads</li>
<li>95% data accuracy claim</li>
<li>Integration with popular CRMs</li>
<li>GDPR compliant</li>
<li>24/7 customer support</li>
</ul>
<h3 id="cons_5">Cons</h3>
<ul>
<li>Higher starting price compared to some competitors</li>
<li>Limited features in lower-tier plans</li>
</ul>
<h3 id="pricing_5">Pricing</h3>
<p>Free trial available, paid plans starting at $99/month.</p>
<h3 id="best-for_5">Best for</h3>
<p>Teams needing verified contact data and CRM integration.</p>
<h2 id="7-adaptio">7. Adapt.io</h2>
<p><img alt="Adapt's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/adapt.png" /></p>
<p>Adapt's homepage</p>
<p><a href="https://www.adapt.io/?ref=nubela.co">Adapt.io</a> lets you search for and enrich B2B contacts via CSV, browser extension, and other workflows.</p>
<h3 id="pros_6">Pros</h3>
<ul>
<li>Targeting across 3,000+ tech sectors</li>
<li>Funding and employee growth signals</li>
<li>50+ enrichment attributes</li>
</ul>
<h3 id="cons_6">Cons</h3>
<ul>
<li>Some advanced features only available in higher-tier plans</li>
<li>May require customization for specific needs</li>
</ul>
<h3 id="pricing_6">Pricing</h3>
<p>Free trial available, paid plans starting at $49/month.</p>
<h3 id="best-for_6">Best for</h3>
<p>Businesses targeting specific tech sectors and high-growth companies.</p>
<h2 id="8-leadfeeder">8. Leadfeeder</h2>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/leadfeeder--1-.png" /></p>
<p>Leadfeeder's homepage</p>
<p><a href="https://www.leadfeeder.com/?ref=nubela.co">Leadfeeder</a> identifies website visitors and provides company contact information, with CRM integrations layered on top.</p>
<p>This is not classic person enrichment. It is closer to inbound account intelligence.</p>
<h3 id="pros_7">Pros</h3>
<ul>
<li>Identifies companies visiting your website</li>
<li>Reveals the behavior of visiting companies</li>
<li>Advanced filters for lead quality</li>
<li>Integrates with CRM and marketing tools</li>
</ul>
<h3 id="cons_7">Cons</h3>
<ul>
<li>Data from the last 7 days only on the free plan</li>
<li>A maximum of 100 identified companies on the free plan</li>
</ul>
<h3 id="pricing_7">Pricing</h3>
<p>Free trial available, paid plans starting at $99 per month paid annually.</p>
<h3 id="best-for_7">Best for</h3>
<p>Sales and marketing teams trying to convert website visitors into leads.</p>
<h2 id="9-voila-norbert">9. Voila Norbert</h2>
<p><img alt="Voila Nobert's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/nobert.png" /></p>
<p>Voila Nobert's homepage</p>
<p><a href="https://www.voilanorbert.com/?ref=nubela.co">Voila Norbert</a> finds professional email addresses with high accuracy and integrates with CRM systems.</p>
<h3 id="pros_8">Pros</h3>
<ul>
<li>Finds professional email addresses and can enrich contacts</li>
<li>Provides bulk actions, native integrations, and an API</li>
<li>Chrome extension for easy prospecting</li>
<li>Includes outreach automation features</li>
</ul>
<h3 id="cons_8">Cons</h3>
<ul>
<li>Some advanced features only available in higher-tier plans</li>
<li>Limited to 50 free leads before requiring a paid plan</li>
</ul>
<h3 id="pricing_8">Pricing</h3>
<p>Free trial available, paid plans starting at $49 per month.</p>
<h3 id="best-for_8">Best for</h3>
<p>Businesses focused on email-based prospecting.</p>
<h2 id="10-findthatlead">10. FindThatLead</h2>
<p><img alt="FindThatLead's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/findthatlead--1-.png" /></p>
<p>FindThatLead's homepage</p>
<p><a href="https://www.findthatlead.com/?ref=nubela.co">FindThatLead</a> focuses on finding professional email addresses, verifying them, and integrating with CRM systems.</p>
<h3 id="pros_9">Pros</h3>
<ul>
<li>All-in-one lead generation tool with advanced filters</li>
<li>Chrome extension for easy email extraction from web pages, LinkedIn, and Crunchbase</li>
<li>Automated prospecting and email campaigns</li>
<li>User-friendly interface</li>
<li>Integration with CRMs and other marketing tools</li>
<li>GDPR compliant</li>
</ul>
<h3 id="cons_9">Cons</h3>
<ul>
<li>Some advanced features only available in higher-tier plans</li>
<li>Limited to 50 email credits on the free plan</li>
</ul>
<h3 id="pricing_9">Pricing</h3>
<p>Free trial available, paid plans starting at $60 per month billed annually.</p>
<h3 id="best-for_9">Best for</h3>
<p>Businesses looking for a lead generation tool that fits into an existing CRM and outreach stack.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/revops</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/anotherrandom_guy</span>
<span style="color:#878a8c;">· ▲ 5</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">ZoomInfo, clearbit, Apollo.io, leadIQ, Cognism, and so much more. Seems like there is a new enrichment tool popping up more and more. Probably need to focus on what your true ICP is and do some data comparisons.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/revops/comments/155xn31/alternatives_to_clay_for_data_enrichment/jszc9zb/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That comment is right, and it cuts through a lot of the noise.</p>
<p>The category keeps expanding, but the buying mistake is still the same: people compare vendors before they decide whether they need contact enrichment, company enrichment, waterfall enrichment, or workflow software.</p>
<h2 id="11-seamlessai">11. Seamless.AI</h2>
<p><img alt="Seamless.AI's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/seamlessai.png" /></p>
<p>Seamless.AI's homepage</p>
<p><a href="https://www.seamless.ai/?ref=nubela.co">Seamless.AI</a> provides enrichment through a Chrome app, web app, and broader lead generation workflows.</p>
<h3 id="pros">Pros</h3>
<ul>
<li>Finds verified phone numbers and emails, enriches contacts</li>
<li>Real-time search engine for B2B sales leads</li>
<li>Chrome extension for easy prospecting</li>
<li>Integrates with Salesforce, HubSpot, and LinkedIn Sales Navigator</li>
<li>Includes AI-assisted sales messaging</li>
</ul>
<h3 id="cons">Cons</h3>
<ul>
<li>Some advanced features only available in higher-tier plans</li>
<li>Free plan limited to 50 credits</li>
</ul>
<h3 id="pricing">Pricing</h3>
<p>Free trial available, paid plans starting at $147 per month.</p>
<h3 id="best-for">Best for</h3>
<p>Sales teams looking for leads plus verified contact data.</p>
<h2 id="12-clearbit-connect">12. Clearbit Connect</h2>
<p><img alt="Clearbit Connect's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/clearbit-connect.png" /></p>
<p>Clearbit Connect's homepage</p>
<p>Clearbit Connect provides contact information directly from your inbox, integrating with Gmail and Outlook.</p>
<h3 id="pros_1">Pros</h3>
<ul>
<li>Finds email addresses from your inbox</li>
<li>Free to use</li>
<li>Search by company domain, name, job title, or role</li>
<li>Provides job title, social profile, and location details</li>
<li>Integrates with Gmail via Chrome extension</li>
</ul>
<h3 id="cons_1">Cons</h3>
<ul>
<li>Limited to 10 free credits per month</li>
<li>Some advanced features only available through other Clearbit products</li>
</ul>
<h3 id="pricing_1">Pricing</h3>
<p>Free to use with 10 free credits per month.</p>
<h3 id="best-for_1">Best for</h3>
<p>People who need quick email lookup directly from their inbox.</p>
<h2 id="13-contactout">13. ContactOut</h2>
<p><img alt="ContactOut's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/contact-out.png" /></p>
<p>ContactOut's homepage</p>
<p><a href="https://contactout.com/?ref=nubela.co">ContactOut</a> finds email addresses and phone numbers with high accuracy and integrates with LinkedIn.</p>
<h3 id="pros_2">Pros</h3>
<ul>
<li>300M professionals from 30M companies in the database</li>
<li>Chrome extension for easy email and phone number extraction</li>
<li>API with hourly updates for 300M contact details</li>
<li>AI-powered personalization for emails</li>
<li>GDPR and CCPA-compliant</li>
</ul>
<h3 id="cons_2">Cons</h3>
<ul>
<li>Limited free plan with only 5 emails and phone numbers per day</li>
<li>Higher-tier plans can be expensive for small teams</li>
</ul>
<h3 id="pricing_2">Pricing</h3>
<p>Free plans available, and paid plans starting at $49 per month.</p>
<h3 id="best-for_2">Best for</h3>
<p>Recruiters, sales professionals, and businesses looking for accurate contact information for outreach.</p>
<h2 id="14-rocketreach">14. RocketReach</h2>
<p><img alt="RocketReach's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/rocket-reach.png" /></p>
<p>RocketReach's homepage</p>
<p><a href="https://rocketreach.co/?ref=nubela.co">RocketReach</a> offers contact data including email addresses, phone numbers, and social media profiles.</p>
<h3 id="pros_3">Pros</h3>
<ul>
<li>Global phone and email coverage</li>
<li>Verified email deliverability claims of 90% to 98%</li>
<li>Automated prospect lists that update by title, location, industry, and skills</li>
<li>Intent data and AI recommendations</li>
<li>Integrates with Salesforce and HubSpot</li>
<li>Browser extension for prospecting</li>
<li>Large database with 700M profiles and 60M companies</li>
</ul>
<h3 id="cons_3">Cons</h3>
<ul>
<li>Higher-tier plans may be expensive for small businesses</li>
<li>Some advanced features only available through integrations and API access</li>
</ul>
<h3 id="pricing_3">Pricing</h3>
<p>Free plan available, paid plans starting at $99 per month.</p>
<h3 id="best-for_3">Best for</h3>
<p>Sales or recruiting teams that want a broader contact database.</p>
<h2 id="final-comparison">Final comparison</h2>
<p>Here is the practical comparison. I added star ratings because a flat feature list hides too much.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Core focus</th>
<th>Data quality</th>
<th>Pricing</th>
<th>Ease of use</th>
<th>API</th>
<th>Best for</th>
<th>Avg. score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proxycurl</td>
<td>Legacy people, company, contact API</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>Historical API comparison</td>
<td>4.50/5</td>
</tr>
<tr>
<td>NinjaPear</td>
<td>Enrichment + competitive intelligence</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>GTM teams needing more than static enrichment</td>
<td>4.50/5</td>
</tr>
<tr>
<td>Sapiengraph</td>
<td>Legacy Sheets enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>Spreadsheet-first enrichment</td>
<td>3.75/5</td>
</tr>
<tr>
<td>Kaspr</td>
<td>Contact enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>SDR teams using Chrome</td>
<td>3.50/5</td>
</tr>
<tr>
<td>Hunter.io</td>
<td>Email enrichment</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>Fast email lookup</td>
<td>4.25/5</td>
</tr>
<tr>
<td>UpLead</td>
<td>Verified B2B contacts</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Contact data with CRM sync</td>
<td>4.00/5</td>
</tr>
<tr>
<td>Adapt.io</td>
<td>Contact + company enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Tech targeting workflows</td>
<td>3.75/5</td>
</tr>
<tr>
<td>Leadfeeder</td>
<td>Website visitor intelligence</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Inbound account intelligence</td>
<td>3.50/5</td>
</tr>
<tr>
<td>Voila Norbert</td>
<td>Email finding</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Email outreach workflows</td>
<td>3.50/5</td>
</tr>
<tr>
<td>FindThatLead</td>
<td>Lead gen + email verification</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Basic outbound stacks</td>
<td>3.25/5</td>
</tr>
<tr>
<td>Seamless.AI</td>
<td>Sales leads + contact data</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>Larger outbound teams</td>
<td>3.25/5</td>
</tr>
<tr>
<td>Clearbit Connect</td>
<td>Inbox lookup</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐☆☆☆</td>
<td>Gmail/Outlook users</td>
<td>3.75/5</td>
</tr>
<tr>
<td>ContactOut</td>
<td>Email + phone enrichment</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Recruiters and outbound reps</td>
<td>4.00/5</td>
</tr>
<tr>
<td>RocketReach</td>
<td>Broad contact database</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Recruiting and sales</td>
<td>3.75/5</td>
</tr>
</tbody>
</table>
<h2 id="which-data-enrichment-tools-to-pick">Which data enrichment tools to pick</h2>
<p>If you are a developer or technical RevOps team, the shortlist is different from what a typical SDR wants.</p>
<p>For developers, I would look at NinjaPear first if you want modern enrichment plus adjacent signals like customers, competitors, and monitoring. If you're here because you used Proxycurl before, that is the lineage.</p>
<p>For spreadsheet-heavy users, Sapiengraph was the obvious old answer, but today I'd probably look harder at spreadsheet-native workflows like <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> if I wanted the same low-friction feel with a newer product direction behind it.</p>
<p>For lightweight email enrichment, Hunter.io is still one of the clearest tools in the market. Boring in a good way.</p>
<p>For outbound contact sourcing, ContactOut, UpLead, Kaspr, and RocketReach are still the more straightforward picks depending on whether you care more about browser workflow, verification, or coverage.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/gtmengineering</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Waste-Ad3616</span>
<span style="color:#878a8c;">· ▲ 4</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Yeah I run GTME for an 80 person org, got rid of ZI and Lusha. I replaced it with a slack enrichment. Go in and enter a LinkedIn profile and it’ll push to a table to enrich then email you the results</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/gtmengineering/comments/1pd3odj/can_clay_be_my_main_enrichment_tool_instead_of/ns2fddc/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>That is where the market has gone.</p>
<p>The winning tool is often not the one with the biggest database. It is the one that fits the motion you actually run.</p>
<h2 id="wrapping-things-up">Wrapping things up</h2>
<p>Data enrichment tools provide details like email addresses, phone numbers, job titles, company data, and sometimes much more.</p>
<p>They come in many different forms: Chrome extensions, Google Sheets add-ons, APIs, inbox plugins, and now full-blown GTM workspaces.</p>
<p>The useful way to evaluate them in 2026 is simple:</p>
<ul>
<li>decide whether you need contact data, company data, or workflow software</li>
<li>decide whether the user is an SDR, a RevOps operator, or a developer</li>
<li>compare pricing only after you understand the credit model and data depth</li>
</ul>
<p>If you just need a quick answer, here it is.</p>
<p><strong>Best API-first successor to Proxycurl:</strong> NinjaPear<br />
<strong>Best simple email tool:</strong> Hunter.io<br />
<strong>Best for Chrome-based contact lookup:</strong> Kaspr or ContactOut<br />
<strong>Best for inbound visitor identification:</strong> Leadfeeder</p>
<p>If you want to go one step further than basic enrichment, and you care about who a company sells to, who it competes with, and what changed this week, take a look at NinjaPear. That is a different category edge, and for some teams, it is the difference between buying another contact tool and actually improving pipeline.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How Do I Change or Cancel My Subscription Plan? ]]></title>
        <description><![CDATA[ We get it - flexibility is key when it comes to managing your subscription. Whether you&#39;re looking to upgrade, downgrade, or even cancel your plan, we&#39;ve streamlined the process to be as painless as smooth as possible.

Here’s a quick guide to help you with ]]></description>
        <link>https://nubela.co/blog/how-do-i-change-or-cancel-my-subscription-plan/</link>
        <guid isPermaLink="false">669f263838fd8100017fff34</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 23 Jul 2024 11:41:14 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>We get it - flexibility is key when it comes to managing your subscription. Whether you're looking to upgrade, downgrade, or even cancel your plan, we've streamlined the process to be as painless as smooth as possible. <br><br>Here’s a quick guide to help you with each of these options.</p><h2 id="how-do-i-upgrade-my-plan">How do I upgrade my plan?</h2><p>Need extra perks? Running out of credits? Upgrade your plan by following this simple step-by-step guide just for you.</p><ol><li>Let’s say you are on a $49/mo plan and you are considering to upgrade your plan into $299/mo plan.</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcgu0IC6FrDEsa_snCV7top60gi83SiOb2WDiAKtPrKrTtKAG76pwozSVeTP17USPk_eXEJ1TngIrnLizkWurv1jds0iDa33-SrVGvQsKlnfsviaVGVsPf6y4MX0SKoReELwBMNhsD4VQCfDNX6ikBt14s?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Upgrade plan on Proxycurl dashboard" loading="lazy" width="1578" height="878"></figure><ol start="2"><li>You will then be redirected to the Change plan page. Choose your new plan and click “Upgrade plan”.</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdTxRO7auzmwu21EnJZ6y-pTISldTUnX1z8qTW5A4jEgZeSKKZYoegW6RVYDiEWfqkRHShE6kVv68PDC8eQVyMH-yee8EnV4RF91P_MaVq00C8fVfHLGlnaQNV7akDTN3cIMFjzVwv_iWVBu5cQxnUQSKYE?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Upgrade plan on Proxycurl dashboard" loading="lazy" width="788" height="684"></figure><ol start="3"><li>An order confirmation will pop up. If you'd like to enable the auto-topup, click on “Change plan and enable credit auto-topup”. For manual-topup, you can click “Change plan only”. You can always enable auto-topup later in your account settings.</li></ol><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/image.png" class="kg-image" alt="Pay for plan upgrade on Proxycurl dashboard" loading="lazy" width="1599" height="899"></figure><p></p><ol start="4"><li>And you're done! You will receive a confirmation saying that your upgrade is successful. Enjoy your new plan!</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf7St-alvZC7Nj7o-SJ5XmgkxKL73rKnew32QpcZxrSjmaUmkBmgM3x2l8U6fLAShOeMQGHEiXO8U7HbeftkKuELH1ixGWDW6BQ45Edrvbr_RFlQS82NK6Y-SnHoaPo4f9C0AMMb59I0Mw7rhb8HubyA4rr?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Payment completed for Proxycurl plan upgrade" loading="lazy" width="406" height="470"></figure><p></p><h2 id="how-do-i-downgrade-my-plan">How do I downgrade my plan?</h2><ol><li>From your Proxycurl dashboard, head to “Plan and payments”. Select your new plan then click on “Change or cancel plan”.</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfEk9MI7L1KNXaOoQwD199zKLcpWM4VaYlu66N84zK52_cM9GYXIi-CtQW33EAFCiXXa3C-T2ZdzHf3bQ2vIFwP1Z6vHzeezGiJGl6TSbIDy1q9RDNCGcIttY3YzWJuVJantQhCNH6NprzNnaD3Kg5UUrDS?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Downgrade plan on Proxycurl dashboard" loading="lazy" width="1572" height="852"></figure><ol start="2"><li>You will then be redirected to the 'Change plan' page. Select your new plan and click on “Downgrade plan”.</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfi5Vh8aeCngaFNFbtMUn7IvWLLwKWKEmpvxR96SEPw3atgQ3Jpa8oVHycgJLmRF4dW8LtgR6gm1sxRiyPv0Y54yDMCKHsDI58uethOM7DIhbaC5X47x87GjIBcwSG3tOrgRV0RRz36iKPixtAoSOsifUx3?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Downgrade plan on Proxycurl dashboard" loading="lazy" width="695" height="606"></figure><ol start="3"><li>A pop-up message will display your cancellation fees. Tell us why you would like to cancel your plan, then click “Next”.<br><br>(Note: <a href="https://nubela.co/blog/subscription-plan-cancellation/#:~:text=For%20the%201st%20plan%20%2D%20the,with%20a%20monthly%20billing%20frequency." rel="noreferrer">If you're ending your annual subscription early, you might be liable for cancellation fees!</a>)</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf_i72Pk1meGPPGzI8M53-AeGi2rU4WvGxLarBmsUIQsh6kELJg2webPacIVm4EdgOi814tbJX0nm_rgESrblda3T_bd4p7D3efFVLqsdhYWljYyt4FXazlcQQL-8rtemUig5El-LX2QfWbzNIU68DEa935?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Pay for Proxycurl plan cancellation fees" loading="lazy" width="792" height="680"></figure><p></p><ol start="4"><li>Click on “Pay $xxxx and Cancel plan”. </li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf96s7AzGQjf2CpochBo-j8Ge5SvniPvDQXVkEmw_L5J5V1Aguf_HJvQKpxlEyL0Z4tK2YvMDY6IwtXKV2o7s8mWalLzj4fuWaF-sn8Ad76Y16cZR05BMZ656nAFv1hNKW5NzzVFCUPU2m860kDt2kmIcPy?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Pay for Proxycurl plan cancellation fees" loading="lazy" width="789" height="688"></figure><ol start="5"><li>You’re done! Your subscription has been cancelled successfully!</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeq7YJ78-a5TtkkpRSirnXuyL3OZXNGMrwHtopbBozyt7hd_MLJffPnr_aw6dKQKH95wzPFG8b4nGLYR0SFbKr3G1Xz3Yrj6FIKIOo49TaHg5VgAMfFSGPdyzWqvy76A9y76Vit_OU7_KeGD9w82INyyjXN?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Proxycurl plan cancellation completed" loading="lazy" width="683" height="520"></figure><p>You're all set and can now resubscribe to a lower-tier subscription plan. Please note that if you choose to downgrade your plan, you will be liable for cancellation fees, as this is considered a breach of contract. Downgrading is treated the same as canceling your plan, which is why cancellation fees apply.</p><h2 id="i%E2%80%99d-like-to-cancel-my-plan-how-do-i-do-it">I’d like to cancel my plan, how do I do it?</h2><p>Thinking about canceling your subscription plan? Follow this step-by-step guide.</p><ol><li>From your Proxycurl dashboard, go to the “Plan and payments” page. Click on “Change or cancel plan”.</li></ol><figure class="kg-card kg-image-card"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/07/image-3.png" class="kg-image" alt="Cancel plan on Proxycurl dashboard" loading="lazy" width="1574" height="873"></figure><ol start="2"><li>You will then be redirected to “Change plan” page. Scroll down and click on the “Cancel plan” button.</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeDIpTnca1d-LR21sL5FSL2GYrm7kcWWTkYgokO6YX2z_yyS8FCDeKSHCkWTyeAzvbXll2uesLg-qZ3n-9AjvQrFvcIOCb8lcRSbW4dBF-_xVCLTswr7pi8fb5ZXF8EqERKQTBgg09bR7SrrJ1wp3kkcpA?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Cancel plan on Proxycurl dashboard" loading="lazy" width="779" height="675"></figure><ol start="3"><li>A pop-up message will display your cancellation fees. Tell us why you would like to cancel your plan, then click “Next”.<br><br>(Note: <a href="https://nubela.co/blog/subscription-plan-cancellation/#:~:text=For%20the%201st%20plan%20%2D%20the,with%20a%20monthly%20billing%20frequency." rel="noreferrer">If you're ending your annual subscription early, you might be liable for cancellation fees!</a>)</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf_i72Pk1meGPPGzI8M53-AeGi2rU4WvGxLarBmsUIQsh6kELJg2webPacIVm4EdgOi814tbJX0nm_rgESrblda3T_bd4p7D3efFVLqsdhYWljYyt4FXazlcQQL-8rtemUig5El-LX2QfWbzNIU68DEa935?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Pay for Proxycurl plan cancellation fees" loading="lazy" width="792" height="680"></figure><p></p><ol start="4"><li>Click on “Pay $xxxx and Cancel plan”. </li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf96s7AzGQjf2CpochBo-j8Ge5SvniPvDQXVkEmw_L5J5V1Aguf_HJvQKpxlEyL0Z4tK2YvMDY6IwtXKV2o7s8mWalLzj4fuWaF-sn8Ad76Y16cZR05BMZ656nAFv1hNKW5NzzVFCUPU2m860kDt2kmIcPy?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Pay for Proxycurl plan cancellation fees" loading="lazy" width="789" height="688"></figure><ol start="5"><li>You’re done! Your subscription has been cancelled successfully!</li></ol><figure class="kg-card kg-image-card"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeq7YJ78-a5TtkkpRSirnXuyL3OZXNGMrwHtopbBozyt7hd_MLJffPnr_aw6dKQKH95wzPFG8b4nGLYR0SFbKr3G1Xz3Yrj6FIKIOo49TaHg5VgAMfFSGPdyzWqvy76A9y76Vit_OU7_KeGD9w82INyyjXN?key=aEOdaZSU0M_0ktlgY2Z3WA" class="kg-image" alt="Proxycurl plan cancellation completed" loading="lazy" width="683" height="520"></figure><p></p><p>You can resubscribe any time from the comfort of your own dashboard. Thank you for choosing Proxycurl and we hope to serve you again! </p><p></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How Lior Neu-ner Bootstrapped His Job Board, Remote Rocketship, to Over 350,000 Unique Visitors per Month ]]></title>
        <description><![CDATA[ Learn how Lior profitably bootstrapped his niche job board, Remote Rocketship, to over 350,000 monthly unique visitors. ]]></description>
        <link>https://nubela.co/blog/how-lior-neu-ner-grew-his-job-board-remote-rocketship/</link>
        <guid isPermaLink="false">666cb46138fd8100017ffa6a</guid>
        <category><![CDATA[ job board ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Fri, 28 Jun 2024 02:24:10 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_401-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>I recently emailed our wonderful newsletter subscribers about our old Jobs API and <a href="https://nubela.co/blog/how-to-build-a-job-board-with-this-new-Professional">how you can build a job board with our B2B enrichment API</a>. And I had the pleasure of having Lior Neu-ner, the founder of <a href="https://www.remoterocketship.com/?ref=nubela.co">Remote Rocketship</a>, respond to that email explaining he's currently running a job board with the help of our API and was interested in doing an interview breaking down how his job board works behind the scenes.</p>
<p>So, of course, I took him up on that offer.</p>
<p>By the way, if you didn't already know, Remote Rocketship is a job board that specializes in helping people land remote jobs:</p>
<p><img alt="Remote Rocketship's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/remote-rocketship.png" /></p>
<p>Remote Rocketship's homepage.</p>
<p>It's quite an interesting project.</p>
<p>So, let's find out how Lior grew Remote Rocketship into what it is today:</p>
<h2 id="introduction-to-remote-rocketship">Introduction to Remote Rocketship</h2>
<h3 id="who-is-lior-neu-ner">Who is Lior Neu-ner?</h3>
<p><strong>Colton:</strong> Hey, Lior, could you introduce yourself?</p>
<p><strong>Lior:</strong> Yeah. Yeah. I'm Lior, and, I'm the founder of Remote Rocketship. Remote Rocketship is a job board for remote jobs. We work differently than most other job boards, since most other job boards require companies to pay to post their jobs on their job board.</p>
<h3 id="what-does-remote-rocketship-do">What does Remote Rocketship do?</h3>
<p><strong>Colton:</strong> What do you do instead?</p>
<p><strong>Lior:</strong> What we do instead is we scrape job openings from 30,000 plus companies that we have, and we post all their job openings on our website. So job seekers love us just because we have tens of thousands more job openings than most other job boards.</p>
<h3 id="how-does-remote-rocketship-make-money">How does Remote Rocketship make money?</h3>
<p><strong>Colton:</strong> Awesome. And so your form of monetization is what?</p>
<p><strong>Lior:</strong> Most job boards charge companies to pay to post the listings. What I do instead is I charge job seekers $5 a week or $18 a month. In return, they get access to all the jobs we have on our website.</p>
<p><img alt="While you can see a few job listings for free, you need to sign up to see all of them." src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/salespage-final.png" /></p>
<p>While you can see a few job listings for free, you need to sign up to see all of them.</p>
<h2 id="technical-foundations">Technical foundations</h2>
<h3 id="how-remote-rocketship-works">How Remote Rocketship works</h3>
<p><strong>Colton:</strong> What is the fundamental technology stack behind Remote Rocketship?</p>
<p><strong>Lior:</strong> The technology behind it is pretty simple. The front end is <a href="https://nextjs.org/?ref=nubela.co">Next.js</a>, and the backend is <a href="https://supabase.com/?ref=nubela.co">Supabase</a>. But really, how everything comes together is through scraping job openings. I then use Proxycurl to enrich the company data for the job openings. So, when people see a job opening, there's lots of information about who the company is and what they're doing.</p>
<blockquote>
<p><strong>Note</strong>
Proxycurl has since been sunset. The founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, our current B2B data platform. I have retained the original references to Proxycurl in this interview because that is the product Lior was using at the time.</p>
</blockquote>
<h3 id="how-lior-is-using-proxycurls-api">How Lior is using Proxycurl's API</h3>
<p><strong>Colton:</strong> What Proxycurl endpoints are you using?</p>
<p><strong>Lior:</strong> The <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-company-profile-endpoint">Company Profile Endpoint</a>. I think it's the company profile one, the slash company endpoint. So, for example, if you look at our website, what I pull from Proxycurl is the company size, funding information if available, a blurb about what the company does, and their LinkedIn URLs.</p>
<h3 id="how-to-pull-company-data-with-our-company-profile-endpoint">How to pull company data with our Company Profile Endpoint</h3>
<p>You'll first need a Proxycurl account and an API key to query our API, but outside of that, it's very simple to pull data from our API.</p>
<p>For example, here's a cURL request:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/linkedin/company' \
    --data-urlencode 'url=https://www.linkedin.com/company/google/' \
    --data-urlencode 'categories=include' \
    --data-urlencode 'funding_data=include' \
    --data-urlencode 'exit_data=include' \
    --data-urlencode 'acquisitions=include' \
    --data-urlencode 'extra=include' \
    --data-urlencode 'use_cache=if-present' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>The above would return tons of information about a given LinkedIn company, including the number of employees, funding data, exit data, acquisitions, and more.</p>
<h3 id="how-lior-scrapes-job-data">How Lior scrapes job data</h3>
<p><strong>Colton:</strong> How do you scrape job data?</p>
<p><strong>Lior:</strong> Most companies use something called an applicant tracking system (ATS), like Greenhouse, Workable, or Lever, to manage their hiring pipeline. All the job openings are hosted on some sort of URL on these websites. I use <a href="https://www.scrapingbee.com/?ref=nubela.co">ScrapingBee</a> (a web scraping API) to search Google for all the ATS links and check these links daily for new jobs. The job itself isn't scraped from LinkedIn; we get the job name, company, remote status, financial information, full-time status, and salary from the ATS links.</p>
<p><img alt="ScrapingBee is a web scraping API that handles the annoying stuff for you." src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/scrapingbee.png" /></p>
<p>ScrapingBee is a web scraping API that handles the annoying stuff for you.</p>
<p><strong>Note:</strong> Lior <a href="https://www.scrapingbee.com/blog/build-job-board-web-scraping/?ref=nubela.co">wrote a guest post for ScrapingBee</a> where he elaborates a bit more on this, and after speaking to him, his general strategy for scraping job data is:</p>
<ol>
<li>Use ScrapingBee's web scraping API to scrape ATS links, such as <code>https://apply.workable.com/{company}/j/{job_id}</code></li>
<li>Extract and parse job information from relevant URLs, Lior uses ChatGPT's API to help with this</li>
<li>Aggregate, and display that data</li>
</ol>
<p><img alt="An example of a Workable ATS job listing URL." src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/workable.png" /></p>
<p>An example of a Workable ATS job listing URL for a "Senior Software Engineer."</p>
<p><strong>Colton:</strong> And then you use Proxycurl to enrich the company information?</p>
<p><strong>Lior:</strong> Yes, exactly. Proxycurl enriches the company data with details like company size and funding information. This adds significant value to our job listings and helps job seekers make more informed decisions.</p>
<p><img alt="The different data points that are provided on a job page on Remote Rocketship." src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/info-px.png" /></p>
<p>The different data points that are provided on a job page on Remote Rocketship.</p>
<h3 id="how-you-can-pull-job-data-with-proxycurl">How you can pull job data with Proxycurl</h3>
<p>While Lior individually scrapes ATS links, you could also pull job data and LinkedIn job listings through our Jobs API.</p>
<p>It could be as simple as the following cURL request to our <a href="https://nubela.co/proxycurl/docs?shell&ref=nubela.co#jobs-api-job-search-endpoint">Job Search Endpoint</a>:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/v2/linkedin/company/job' \
    --data-urlencode 'job_type=anything' \
    --data-urlencode 'experience_level=entry_level' \
    --data-urlencode 'when=past-month' \
    --data-urlencode 'flexibility=remote' \
    --data-urlencode 'keyword=software engineer' \
    --data-urlencode 'search_id=1035'
</code></pre>
<p>That would return all of the entry-level remote job listings for Microsoft software engineers, using Microsoft's <code>search_id</code>. You can find a <code>search_id</code> of a company via our Company Profile Endpoint if you don't already have it.</p>
<p>Additionally, if you wanted to enrich any given LinkedIn job listing, you could do so with our <a href="https://nubela.co/proxycurl/docs?shell&ref=nubela.co#jobs-api-job-profile-endpoint">Job Profile Endpoint</a>.</p>
<p>Here's a quick example of that:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/linkedin/job' \
    --data-urlencode 'url=https://www.linkedin.com/jobs/view/3667167926/'
</code></pre>
<h2 id="making-money-and-growth">Making money and growth</h2>
<h3 id="how-remote-rocketship-grew">How Remote Rocketship grew</h3>
<p><strong>Colton:</strong> What was your first growth mechanism? How did you originally generate traction for Remote Rocketship?</p>
<p><strong>Lior:</strong> The story behind it is what resonated with people. My wife was looking for a remote job and was frustrated with the lack of job openings and company information on other job boards. I knew many great companies were hiring but weren't listed on these job boards because they didn't want to pay for listings. So, I built a scraper to check for new job openings every day, giving us more job openings and getting them before other applicants.</p>
<p>I shared the site on Reddit, specifically on r/TheWorldIsBeautiful, and it did super well. I got 150,000 visitors in one day, which crashed the site. I also shared it on r/overemployed, where remote workers juggling multiple jobs found it particularly useful.</p>
<h3 id="remote-rocketship-even-landed-lior-a-job">Remote Rocketship even landed Lior a job</h3>
<p><strong>Colton:</strong> You're currently working for PostHog as well as a technical writer, correct? Is there any connection between the two projects?</p>
<p><strong>Lior:</strong> Yeah, Remote Rocketship is actually how I found PostHog. After launching on Reddit, I needed a new analytics tool. Someone recommended PostHog on Twitter. I checked it out, found it to be a cool company, and they had a job opening for a technical writer. I applied and got the job. PostHog is cool with me working on Remote Rocketship on the side.</p>
<p><img alt="PostHog's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/posthog-hp.png" /></p>
<p>PostHog's homepage.</p>
<p><strong>Colton:</strong> What do you do for PostHog?</p>
<p><strong>Lior:</strong> I'm a technical writer, so I handle marketing, SEO, and writing technical content for newsletters, documentation, and other channels.</p>
<h3 id="how-many-unique-visitors-does-remote-rocketship-get">How many unique visitors does Remote Rocketship get?</h3>
<p><strong>Colton:</strong> How many unique visitors does Remote Rocketship get per month?</p>
<p><strong>Lior:</strong> Currently, we get around 350,000 unique visitors per month.</p>
<p><strong>Colton:</strong> What do you think makes Remote Rocketship stand out?</p>
<p><strong>Lior:</strong> One of the features people appreciate is the amount of filters we have, like salary and company size. Company size, in particular, is something we get from Proxycurl. We also allow sorting by funding data, like the most recent fundraise, which is also powered by Proxycurl.</p>
<p><strong>Colton:</strong> You mentioned filters and company size. What other features do users find helpful?</p>
<p><strong>Lior:</strong> People like to sort by various parameters, including the size of the company, which is something we get from Proxycurl. Another popular feature is sorting by the most recent fundraise, again powered by Proxycurl. These features help users tailor their job search to their specific needs and preferences.</p>
<p>Nice! Thanks, Lior!</p>
<p>For anyone interested in landing a remote job, please check out <a href="https://remoterocketship.com/?ref=nubela.co">Remote Rocketship</a>.</p>
<h3 id="is-remote-rocketship-profitable">Is Remote Rocketship profitable?</h3>
<p>While Lior shared financial figures with me privately, he was understandably uninterested in doing so publicly.</p>
<p>So, since I figure you'd like to get an idea of how much money Remote Rocketship is making, I'll leave you with <a href="https://x.com/LiorNn/status/1729798175538454601?ref=nubela.co">this screenshot Lior shared on X</a> from November of 2023:</p>
<p><img alt="Remote Rocketship's revenue from November of 2023." src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/GAF5066W4AAOZIT.jpeg" /></p>
<p>Remote Rocketship's revenue from November of 2023.</p>
<p>...it has only been up from there 😉.</p>
<h2 id="a-quick-recap">A quick recap</h2>
<h3 id="why-remote-rocketship-was-made">Why Remote Rocketship was made</h3>
<p>Remote Rocketship was inspired by Lior's wife having issues finding a remote job. He knew how the job board business model worked and wanted to throw his hat in at building a different kind of job board.</p>
<p>So, Lior set out to make the process of finding and landing remote jobs much easier with Remote Rocketship.</p>
<h3 id="remote-rocketships-technology-stack">Remote Rocketship's technology stack</h3>
<p>Remote Rocketship is built with a solid tech foundation: the front end is developed using Next.js, and the backend is powered by Supabase.</p>
<p>They scrape job listings from over 30,000 companies using scraping APIs such as ScrapingBee, which systematically collects data from Applicant Tracking Systems (ATS) like Workable, Greenhouse, and Lever, and then our B2B enrichment API, which enriches these listings with detailed company information.</p>
<h3 id="monetization-strategy">Monetization strategy</h3>
<p>Remote Rocketship adopts a user-centric revenue model.</p>
<p>Instead of charging companies to post job listings, it charges remote job seekers $5 a week or $18 a month for access to all listings.</p>
<p>Fundamentally, this allows most of this process to be automated and flips the usual business model on its head.</p>
<h3 id="how-remote-rocketship-gained-traction">How Remote Rocketship gained traction</h3>
<p>Remote Rocketship's growth was initially fueled by community engagement and organic traction on platforms like Reddit.</p>
<p>Specifically, Lior shared the story on r/TheWorldIsBeautiful, which led to a viral response and 150,000 visitors in one day. It also gained traction on other subreddits like r/overemployed.</p>
<h2 id="whew-that-was-quite-a-bit">Whew, that was quite a bit</h2>
<p>Hopefully, you found some value and learned a thing or two from this interview.</p>
<p>Job boards have been a pretty popular application idea recently, but Remote Rocketship just goes to show with a slight tweak or two, there is certainly still plenty of potential. You just need to be able to differentiate yourself.</p>
<p>In Lior's case, he focused on remote jobs specifically and flipped the traditional job board business model on its head by monetizing job seekers rather than businesses looking to recruit talent, but there are about a thousand different twists you can put on this. Think outside the box.</p>
<p>This also goes to show you don't need a large development team or a lot of complexities to build profitable projects. Remote Rocketship is run by a single individual who invested a bit of sweat equity upfront. After that, the majority of the project runs on autopilot.</p>
<p>What a time to be alive.</p>
<h2 id="interested-in-creating-your-own-job-board">Interested in creating your own job board?</h2>
<p>Between Proxycurl's old Jobs API and Company API, this was enough to make a project like this work. Today, Proxycurl has been sunset, and the founder behind it is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, a new B2B data platform focused on company intelligence, enrichment, monitoring, and competitive data.</p>
<p>If you'd like to see what we're building now, you can start with NinjaPear's <a href="https://nubela.co/company-api?ref=nubela.co">Company API</a> or browse the main <a href="https://nubela.co/?ref=nubela.co">NinjaPear platform</a>.</p>
<p>Thanks for reading!</p>
<p><strong>P.S.</strong> While Proxycurl worked well for pulling job and company data at the time, the broader mission has continued with NinjaPear. If you want to see where that work has gone, <a href="https://nubela.co/?ref=nubela.co">click here</a>.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ 19 Best Data Enrichment APIs in 2026 ]]></title>
        <description><![CDATA[ Learn the purpose of a data enrichment API and the top 19 data enrichment APIs of 2025. 1. Proxycurl 2. Clearbit 3. ZoomInfo ]]></description>
        <link>https://nubela.co/blog/best-data-enrichment-apis/</link>
        <guid isPermaLink="false">66395f0225e37900018e4b35</guid>
        <category><![CDATA[ crm data enrichment ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Thu, 13 Jun 2024 12:40:58 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_400.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>If you're looking for the best <strong>data enrichment API</strong>, here's the short version: for modern API-first enrichment, I would look at <strong>NinjaPear</strong>, <strong>People Data Labs</strong>, and <strong>Clearbit/Breeze Intelligence</strong> first, then go narrower based on whether you care more about contact data, company data, or identity verification. The bigger surprise is that a lot of the old list still exists, but the market has shifted hard toward fresher data, easier self-serve onboarding, and better workflow fit.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/SaaS</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/SavannahCallaway</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">I've used some and researched some of them so here are my thoughts: People Data Labs (PDL) one of the standard names in the industry. Their APIs are pretty solid for high volume needs. I'll say they fall short in terms of freshness as they update only monthly. The search filters are pretty basic compared to other providers.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/SaaS/comments/1r1r54w/what_are_the_best_b2b_data_enrichment_apis_for/o4rvzsm/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>What's worse than inaccurate data? Incomplete data.</p>
<p>Raw data lacks the depth and context necessary to be truly useful.</p>
<p>This is where data enrichment comes in to help fill the gaps.</p>
<h2 id="what-is-data-enrichment">What is data enrichment?</h2>
<p>Data enrichment involves enhancing raw data by adding valuable information from external sources.</p>
<p>Imagine having a list of customer names and email addresses. Data enrichment can augment this list with details like job titles, company names, social media profiles, and other relevant information.</p>
<p>This enriched data offers a more complete view of your prospects/customers, allowing you to do much more in many different aspects.</p>
<h3 id="understanding-apis">Understanding APIs</h3>
<p>To efficiently perform data enrichment, businesses often use APIs.</p>
<p>An API, or Application Programming Interface, is like a translator that allows different software applications to communicate with each other.</p>
<p>One system requests data or services from another system and receive a response, in a structured way.</p>
<h3 id="how-data-enrichment-apis-work">How data enrichment APIs work</h3>
<p>A <strong>data enrichment API</strong> is a specialized tool that adds external information to your existing datasets programmatically.</p>
<p>Instead of manually searching for and inputting additional data, these APIs automate the process.</p>
<p>For example, if you have a customer's name and email address, a data enrichment API can automatically retrieve and add their job title, company details, and social media profiles to your database.</p>
<p>It saves time, reduces manual entry errors, keeps information current, and handles large volumes of data efficiently.</p>
<h2 id="benefits-of-data-enrichment-apis">Benefits of data enrichment APIs</h2>
<p>Data enrichment APIs have a wide range of applications, including:</p>
<h3 id="improved-customer-insights">Improved customer insights</h3>
<p>Enriched data helps create detailed customer profiles, enabling personalized marketing and enhanced customer experiences.</p>
<p>It augments existing customer information with additional data points such as demographic details, social media activity, and purchasing history, so you understand the customers' needs and preferences better.</p>
<p>This allows for more targeted marketing campaigns, higher customer satisfaction, and increased loyalty.</p>
<h3 id="enhanced-lead-scoring">Enhanced lead scoring</h3>
<p>Add context to leads for accurate scoring and prioritization.</p>
<p>Data enrichment APIs can provide additional information about potential leads, such as company size, industry, job role, and beyond.</p>
<p>This extra data helps sales and marketing teams prioritize high-value leads, focus their outreach, and increase conversion rates.</p>
<p>Enhanced lead scoring ensures your most promising leads receive the attention they deserve, improving overall sales efficiency.</p>
<h3 id="fraud-detection">Fraud detection</h3>
<p>Enriched data can help identify suspicious patterns and behaviors, enhancing fraud detection mechanisms.</p>
<p>By integrating data from various sources, you gain a more complete view of transactions and user activities.</p>
<p>This makes it easier to spot anomalies and detect fraudulent activities early on.</p>
<p>For example, enriched data might reveal inconsistencies in billing addresses, unusual purchasing patterns, or mismatched user information, all of which can signal potential fraud.</p>
<h3 id="market-research">Market research</h3>
<p>Market trends and competitor activities are highlighted with data enrichment.</p>
<p>Research at scale often means analyzing hundreds or thousands of companies, websites, and public signals. That gets painful fast without a reliable API layer.</p>
<p>By aggregating data from different sources, companies can analyze market dynamics, customer behavior, and competitive landscapes.</p>
<p>This enriched data allows you to make informed strategic decisions, identify new market opportunities, and stay ahead of industry trends.</p>
<h3 id="fill-your-data-gaps">Fill your data gaps</h3>
<p>Enrichment helps in filling gaps and correcting inaccuracies in datasets.</p>
<p>Over time, databases can become cluttered with incomplete or outdated information.</p>
<p>Data enrichment APIs can automatically update and validate data entries, ensuring that records are accurate and up-to-date. This helps you stay on top of competition and spot opportunities earlier.</p>
<p>Clean, enriched data is essential for making accurate forecasts, optimizing operations, and maintaining regulatory compliance.</p>
<h3 id="personalized-customer-experiences">Personalized customer experiences</h3>
<p>Enriched data gives you the power to personalize customer experiences by tailoring products, services, and communications to individual preferences.</p>
<p>For example, a retail company can use enriched customer data to recommend products based on previous purchases and browsing behavior.</p>
<p>Similarly, financial institutions can offer personalized financial advice and product recommendations based on a customer's financial history and goals.</p>
<h3 id="improved-targeting-and-segmentation">Improved targeting and segmentation</h3>
<p>By understanding more about your audience, you can create precise customer segments and deliver relevant content to each group.</p>
<p>This leads to more effective marketing campaigns, higher engagement rates, and better ROI.</p>
<p>For instance, a travel agency can use enriched data to target customers who have shown interest in specific destinations or travel experiences.</p>
<h3 id="enhanced-customer-support">Enhanced customer support</h3>
<p>Enriched data can improve customer support by providing support agents with more complete customer information.</p>
<p>When a customer contacts support, agents can quickly access their purchase history, previous interactions, and preferences, allowing for faster and more effective resolution of issues.</p>
<p>Personalized support leads to higher customer satisfaction and loyalty.</p>
<h3 id="business-intelligence-and-analytics">Business intelligence and analytics</h3>
<p>Data enrichment plays a crucial role in business intelligence and analytics by providing a more complete and accurate dataset for analysis.</p>
<p>With enriched data, you can uncover deeper insights, identify trends, and make data-driven decisions.</p>
<p>This can lead to improved operational efficiency, better resource allocation, and stronger strategic planning.</p>
<h3 id="investing-and-startup-funding">Investing and startup funding</h3>
<p>Enriched data can significantly impact investing and startup funding by providing deeper insights into market trends, investment opportunities, and potential risks.</p>
<p>As an investor, you can use enriched data to identify high-potential ventures, understand the competitive landscape, and perform more thorough due diligence.</p>
<p>For startups, enriched data helps in understanding investor behavior, optimizing fundraising strategies, and identifying key growth areas.</p>
<h2 id="does-one-of-those-use-cases-appeal-to-you">Does one of those use cases appeal to you?</h2>
<p>Whatever your use case might be, there are no shortcomings to having better data. It enhances business processes by providing that additional context and accuracy to your existing data.</p>
<p>Now, let's get into the 19 best data enrichment APIs that can help your business.</p>
<h2 id="the-19-best-data-enrichment-apis">The 19 best data enrichment APIs</h2>
<p>Since this list is rather long, I'll lead with a summarized comparison at the top before the detailed comparison below.</p>
<table>
<thead>
<tr>
<th>API</th>
<th>Data Quality</th>
<th>Pricing</th>
<th>Ease of Use</th>
<th>API</th>
<th>Support</th>
<th>Avg. Score</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>NinjaPear</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.4/5</strong></td>
</tr>
<tr>
<td><strong>Proxycurl (sunset)</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.2/5</strong></td>
</tr>
<tr>
<td><strong>Clearbit / Breeze Intelligence</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.6/5</strong></td>
</tr>
<tr>
<td><strong>ZoomInfo</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td><strong>People Data Labs</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.8/5</strong></td>
</tr>
<tr>
<td><strong>FullContact</strong></td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.8/5</strong></td>
</tr>
<tr>
<td><strong>Pipl</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.6/5</strong></td>
</tr>
<tr>
<td><strong>Demandbase</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td><strong>Enrich</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.8/5</strong></td>
</tr>
<tr>
<td><strong>Datanyze</strong></td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td><strong>Lusha</strong></td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.2/5</strong></td>
</tr>
<tr>
<td><strong>Data Axle</strong></td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.2/5</strong></td>
</tr>
<tr>
<td><strong>Coresignal</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>4.0/5</strong></td>
</tr>
<tr>
<td><strong>Snov.io</strong></td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td><strong>LeadGenius</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td><strong>Mattermark</strong></td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.0/5</strong></td>
</tr>
<tr>
<td><strong>Crunchbase</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td><strong>3.6/5</strong></td>
</tr>
<tr>
<td><strong>HG Insights</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐☆☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.2/5</strong></td>
</tr>
<tr>
<td><strong>Leadspace</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐☆☆☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.4/5</strong></td>
</tr>
<tr>
<td><strong>Melissa</strong></td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td><strong>3.8/5</strong></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>API</th>
<th>Key Features</th>
<th>Best For</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>NinjaPear</strong></td>
<td>Public-web person and company enrichment, work email finder, company details, employee count, customer/competitor data</td>
<td>Teams that want enrichment plus competitive context</td>
</tr>
<tr>
<td><strong>Proxycurl (sunset)</strong></td>
<td>Legacy people and company data, social profiles</td>
<td>Existing legacy users evaluating migration</td>
</tr>
<tr>
<td><strong>Clearbit (Now Breeze Intelligence by HubSpot)</strong></td>
<td>Company demographics, employee information, social profiles</td>
<td>B2B marketing and sales teams</td>
</tr>
<tr>
<td><strong>ZoomInfo</strong></td>
<td>Detailed company and contact information</td>
<td>Sales teams and lead generation</td>
</tr>
<tr>
<td><strong>People Data Labs</strong></td>
<td>Extensive profiles, recruiting software background</td>
<td>Startups</td>
</tr>
<tr>
<td><strong>FullContact</strong></td>
<td>Contact data with social media profiles, job titles, KYC</td>
<td>Identity verification and fraud detection</td>
</tr>
<tr>
<td><strong>Pipl</strong></td>
<td>KYC</td>
<td>Identity verification and fraud detection</td>
</tr>
<tr>
<td><strong>Demandbase</strong></td>
<td>Insights into companies and executives</td>
<td>Market intelligence and lead scoring</td>
</tr>
<tr>
<td><strong>Enrich</strong></td>
<td>Detailed people and company information</td>
<td>General enrichment</td>
</tr>
<tr>
<td><strong>Datanyze</strong></td>
<td>Contact information</td>
<td>Sales departments</td>
</tr>
<tr>
<td><strong>Lusha</strong></td>
<td>Contact data with phone numbers, email addresses, company info</td>
<td>Sales outreach and marketing teams</td>
</tr>
<tr>
<td><strong>Data Axle (Formerly InfoGroup)</strong></td>
<td>Business and consumer information</td>
<td>Business and consumer information</td>
</tr>
<tr>
<td><strong>Coresignal</strong></td>
<td>Professional and company data</td>
<td>Professional and company data enrichment</td>
</tr>
<tr>
<td><strong>Snov.io</strong></td>
<td>Information on companies and contacts</td>
<td>Lead generation and outreach efforts</td>
</tr>
<tr>
<td><strong>LeadGenius</strong></td>
<td>Up-to-date business information</td>
<td>General enrichment</td>
</tr>
<tr>
<td><strong>Mattermark</strong></td>
<td>Company data, growth signals, funding data</td>
<td>Identifying high-potential prospects</td>
</tr>
<tr>
<td><strong>Crunchbase</strong></td>
<td>Information on startups and companies</td>
<td>Market trends and potential partners or funding/investments</td>
</tr>
<tr>
<td><strong>HG Insights</strong></td>
<td>Technographic data</td>
<td>Technographic insights</td>
</tr>
<tr>
<td><strong>Leadspace</strong></td>
<td>Detailed information on companies and contacts</td>
<td>General enrichment, CRM enrichment</td>
</tr>
<tr>
<td><strong>Melissa</strong></td>
<td>Business and consumer information</td>
<td>Data quality and verification</td>
</tr>
</tbody>
</table>
<h2 id="1-ninjapear">1. NinjaPear</h2>
<p><img alt="NinjaPear homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/3b228ce0a20c.webp" /></p>
<p><a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is the new platform I would add to this list first.</p>
<p>And yes, quick context because it matters: the founder behind Proxycurl is now building NinjaPear. Proxycurl API has been sunset, and NinjaPear is where that work has gone next.</p>
<p>NinjaPear is not just another enrichment vendor. It does person and company enrichment, but it also layers in customer data, competitor data, company monitoring, work email finding, company logos, and employee counts.</p>
<p>That matters because a plain enrichment API gives you a better row in your CRM. A richer platform gives you a better decision.</p>
<blockquote>
<p><strong>Callout:</strong> Proxycurl API has been sunset. If you knew Proxycurl from the old version of this article, the newer platform to look at is NinjaPear.</p>
</blockquote>
<p><img alt="NinjaPear Data Explorer" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/381011ab19ad.webp" /></p>
<h3 id="ninjapear-pros">NinjaPear Pros</h3>
<ul>
<li>Public-web-based enrichment, not dependent on LinkedIn scraping</li>
<li>Person profile, company profile, employee count, and work email finder in one place</li>
<li>Adds customer and competitor intelligence, which most enrichment APIs do not</li>
<li>3-day free trial with 10 credits and no credit card required</li>
<li>Pay-as-you-go, no monthly minimums</li>
</ul>
<h3 id="ninjapear-cons">NinjaPear Cons</h3>
<ul>
<li>Newer platform, so some buyers will still compare it against older incumbents on pure brand recognition</li>
<li>If you only need one narrow field and nothing else, the broader platform may be more than you need</li>
</ul>
<h3 id="ninjapear-pricing">NinjaPear Pricing</h3>
<p>NinjaPear offers a 3-day free trial with 10 credits included and no credit card required. Pricing is usage-based with no monthly minimums.</p>
<h3 id="best-for">Best for</h3>
<p>Teams that want a <strong>data enrichment API</strong> plus competitive context, not just one more static record.</p>
<h2 id="2-proxycurl">2. Proxycurl</h2>
<p><img alt="Proxycurl's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de1.png" /></p>
<p>Proxycurl's homepage</p>
<p><a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> was a B2B enrichment API that specialized in people and companies.</p>
<p>It provided a wide range of information, including job titles, company details, social media profiles, contact information, and beyond, which is why it was on this list in the first place.</p>
<p>But this section needs one very important update: <strong>Proxycurl API has been sunset</strong>. I'm keeping it here because a lot of people still search for it by name, and because the product genuinely mattered for this category. The founder behind Proxycurl is now working on NinjaPear.</p>
<h2 id="how-to-enrich-people-with-proxycurl">How to enrich people with Proxycurl</h2>
<p>Historically, enriching people could be as easy as querying the API, specifically the Person Profile Endpoint, with a cURL command, such as:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/v2/linkedin' \
    --data-urlencode 'linkedin_profile_url=https://linkedin.com/in/johnrmarty/' \
    --data-urlencode 'extra=include' \
    --data-urlencode 'github_profile_id=include' \
    --data-urlencode 'facebook_profile_id=include' \
    --data-urlencode 'twitter_profile_id=include' \
    --data-urlencode 'personal_contact_number=include' \
    --data-urlencode 'personal_email=include' \
    --data-urlencode 'inferred_salary=include' \
    --data-urlencode 'skills=include' \
    --data-urlencode 'use_cache=if-recent' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>Which would enrich an individual with their LinkedIn profile URL, though X or Facebook could also be used.</p>
<p>Additionally, a social media profile URL wasn't the only possible method to enrich a person's profile. You could also use the Search API with a name or company, or use solely an email and beyond.</p>
<p>For all options, it was always best to take a look at the documentation.</p>
<h3 id="how-to-enrich-companies-with-proxycurl">How to enrich companies with Proxycurl</h3>
<p>The only thing that changed there was the endpoint, which would be the Company Profile Endpoint instead.</p>
<p>Here's another example using cURL:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer ${YOUR_API_KEY}&quot; \
    'https://nubela.co/proxycurl/api/linkedin/company' \
    --data-urlencode 'url=https://www.linkedin.com/company/google/' \
    --data-urlencode 'resolve_numeric_id=true' \
    --data-urlencode 'categories=include' \
    --data-urlencode 'funding_data=include' \
    --data-urlencode 'exit_data=include' \
    --data-urlencode 'acquisitions=include' \
    --data-urlencode 'extra=include' \
    --data-urlencode 'use_cache=if-recent' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>Of course, like pulling person B2B data, there were also alternative ways to pull company data such as the Company Search Endpoint.</p>
<h3 id="proxycurl-pros">Proxycurl Pros</h3>
<ul>
<li>Comprehensive data coverage for both individuals and companies</li>
<li>An extensive amount of data was available</li>
<li>Provided job-based data</li>
<li>Provided contact information</li>
<li>Could scrape in real time</li>
<li>Competitive pricing</li>
<li>Easy integration with existing systems</li>
<li>Detailed and well-maintained documentation</li>
</ul>
<h3 id="proxycurl-cons">Proxycurl Cons</h3>
<ul>
<li>It would not cover every profile depending on the privacy settings of the individual being enriched</li>
<li>The API has now been sunset</li>
</ul>
<h3 id="proxycurl-pricing">Proxycurl Pricing</h3>
<p>Historically, Proxycurl offered a free trial with 10 free credits, plus pay-as-you-go and subscription plans that started at $49/month.</p>
<h3 id="best-for_1">Best for</h3>
<p>Legacy users researching older options, and anyone trying to understand where this category came from. For net-new buyers, I would start with NinjaPear instead.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/automation</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/MAN0L2</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Don't replace your team with an LLM - set up a simple enrichment pipeline and keep humans only for low-confidence rows. Verify identity and current practice first via NPI registry and state boards, then confirm location on Google Maps and Healthgrades/Doximity, add contacts from ZoomInfo or Clearbit, and auto-verify email, phone, and address with standard validators.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/automation/comments/1pjkpt2/looking_for_ai_data_enrichment_verify_software/ntfsry0/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="3-clearbit-now-breeze-intelligence-for-hubspot">3. Clearbit (Now Breeze Intelligence for HubSpot)</h2>
<p><img alt="Clearbit's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de2.png" /></p>
<p>Clearbit's homepage</p>
<p>Recently acquired by HubSpot, Clearbit's API provides insights into companies and individuals, focusing on firmographic and technographic data.</p>
<p>It's particularly useful for B2B marketing and sales teams looking to build complete customer profiles and improve targeting.</p>
<h3 id="clearbit-pros">Clearbit Pros</h3>
<ul>
<li>Extensive firmographic data</li>
<li>Easy integration</li>
</ul>
<h3 id="clearbit-cons">Clearbit Cons</h3>
<ul>
<li>Common complaints about data accuracy and freshness</li>
<li>You'll have to go through their sales department</li>
<li>Recently purchased by HubSpot, which may or may not fit your stack strategy</li>
</ul>
<h3 id="clearbit-pricing">Clearbit Pricing</h3>
<p>Unfortunately, Clearbit keeps their pricing locked behind a sales team. Many sources have historically claimed the service started at $99/month, but post-acquisition pricing is not very transparent now.</p>
<h3 id="best-for">Best for</h3>
<p>B2B marketing and sales teams.</p>
<h2 id="4-zoominfo">4. ZoomInfo</h2>
<p><img alt="ZoomInfo's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de3.png" /></p>
<p>ZoomInfo's homepage</p>
<p>ZoomInfo offers detailed company and contact information, making it a valuable resource for sales and lead generation.</p>
<p>Its API provides access to a vast database of business profiles, helping sales teams target and connect with the right contacts.</p>
<h3 id="zoominfo-pros">ZoomInfo Pros</h3>
<ul>
<li>Extensive database of business contacts</li>
<li>Detailed company profiles</li>
<li>Advanced filtering options</li>
<li>Very good at contact information</li>
</ul>
<h3 id="zoominfo-cons">ZoomInfo Cons</h3>
<ul>
<li>Complex pricing structure</li>
<li>You'll have to go through their sales department</li>
</ul>
<h3 id="zoominfo-pricing">ZoomInfo Pricing</h3>
<p>ZoomInfo offers custom pricing based on usage and specific needs. Sources have long claimed pricing can start around $14,995/year.</p>
<h3 id="best-for_1">Best for</h3>
<p>Sales teams and lead generation efforts.</p>
<h2 id="5-people-data-labs">5. People Data Labs</h2>
<p><img alt="People Data Labs' homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de4-1.png" /></p>
<p>People Data Labs' homepage</p>
<p>People Data Labs’ API allows you to fill in gaps in your customer data using information you already have.</p>
<p>They advertise over 3.1 billion people profiles that can be searched, sourced, and used to augment your existing data.</p>
<h3 id="people-data-labs-pros">People Data Labs Pros</h3>
<ul>
<li>Good support</li>
<li>Self-serve experience</li>
<li>Strong fit for high-volume use cases</li>
</ul>
<h3 id="people-data-labs-cons">People Data Labs Cons</h3>
<ul>
<li>Can be too reliant on data pulled from LinkedIn-style profile sources</li>
<li>Freshness is a recurring complaint in the market</li>
</ul>
<h3 id="people-data-labs-pricing">People Data Labs Pricing</h3>
<p>PDL is free to use for up to 100 requests per month. Their Pro plan starts at $98/month for 350 requests per month plus email support. Their Enterprise plan is custom pricing and allows access to a tailored set of features.</p>
<h3 id="best-for_2">Best for</h3>
<p>Startups.</p>
<h2 id="6-fullcontact">6. FullContact</h2>
<p><img alt="FullContact's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/fullcontact.png" /></p>
<p>FullContact's homepage</p>
<p>FullContact provides an extensive API for enriching contact data with social media profiles, job titles, company information, ID verification, and more.</p>
<p>However, I think it works best for general identity verification and KYC purposes.</p>
<h3 id="fullcontact-pros">FullContact Pros</h3>
<ul>
<li>Extensive contact enrichment capabilities</li>
<li>Easy-to-use API</li>
<li>Strong customer support</li>
</ul>
<h3 id="fullcontact-cons">FullContact Cons</h3>
<ul>
<li>Higher cost for extensive usage</li>
<li>Data accuracy varies</li>
</ul>
<h3 id="fullcontact-pricing">FullContact Pricing</h3>
<p>FullContact offers a free tier that allows 100 enrichments. Their Pro plan starts at $99/month, with custom pricing available for larger needs.</p>
<h3 id="best-for_3">Best for</h3>
<p>Identity verification and KYC.</p>
<h2 id="7-pipl">7. Pipl</h2>
<p><img alt="Pipl's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de6-1.png" /></p>
<p>Pipl's homepage</p>
<p>Pipl specializes in people data, providing an API that enriches your datasets with personal and professional information from various sources.</p>
<p>Like FullContact, I think it's particularly useful for identity verification and fraud detection.</p>
<h3 id="pipl-pros">Pipl Pros</h3>
<ul>
<li>Comprehensive people data</li>
<li>Strong focus on identity verification</li>
<li>Easy integration</li>
</ul>
<h3 id="pipl-cons">Pipl Cons</h3>
<ul>
<li>Limited business data</li>
<li>Higher cost</li>
<li>High minimum spend</li>
</ul>
<h3 id="pipl-pricing">Pipl Pricing</h3>
<p>Pipl offers custom pricing based on specific needs and usage. Their minimum spend is $500 per month and is all routed through their sales department.</p>
<h3 id="best-for_4">Best for</h3>
<p>Identity verification and fraud detection.</p>
<h2 id="8-demandbase">8. Demandbase</h2>
<p><img alt="Demandbase's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de7.png" /></p>
<p>Demandbase's homepage</p>
<p>Demandbase offers data enrichment APIs that provide insights into people and companies.</p>
<p>It helps businesses improve their lead scoring, market segmentation, and sales strategies and has millions of data points.</p>
<h3 id="demandbase-pros">Demandbase Pros</h3>
<ul>
<li>Detailed company and executive data</li>
<li>Excellent for market segmentation</li>
<li>Strong integration options</li>
</ul>
<h3 id="demandbase-cons">Demandbase Cons</h3>
<ul>
<li>Data accuracy can vary</li>
<li>Higher cost</li>
</ul>
<h3 id="demandbase-pricing-and-usage-limits">Demandbase Pricing and usage limits</h3>
<p>Demandbase offers custom pricing based on usage and needs. Everything is routed through their sales department.</p>
<p>One thing for sure is that the cost differs depending on your team size. Many sources claim the cost for a team of 200 users can range from $18,100 to $31,700 annually. For a company with a headcount of 1,000, it can range from $58,500 to $108,600.</p>
<h3 id="best-for_5">Best for</h3>
<ul>
<li>Market intelligence and lead scoring.</li>
</ul>
<h2 id="9-enrich">9. Enrich</h2>
<p><img alt="Enrich's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de8.png" /></p>
<p>Enrich's homepage</p>
<p>Enrich is a data enrichment API that focuses on enriching people and companies.</p>
<p>It's a newcomer on the block, but it works quite well.</p>
<h3 id="enrich-pros">Enrich Pros</h3>
<ul>
<li>Accurate people and company data</li>
<li>Easy integration</li>
<li>Self-service user experience</li>
</ul>
<h3 id="enrich-cons">Enrich Cons</h3>
<ul>
<li>Higher pricing</li>
</ul>
<h3 id="enrich-pricing">Enrich Pricing</h3>
<p>Enrich offers 25 free monthly credits and then starts at $70 per month after that.</p>
<h3 id="best-for_6">Best for</h3>
<p>General enrichment.</p>
<h2 id="10-datanyze">10. Datanyze</h2>
<p><img alt="datanyze's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de9.png" /></p>
<p>Datanyze's homepage</p>
<p>Datanyze offers a data enrichment API that primarily focuses on enriching sales prospects with accurate contact information.</p>
<p>This information is of course most valuable for sales departments.</p>
<h3 id="datanyze-pros">Datanyze Pros</h3>
<ul>
<li>Good at contact information</li>
<li>Useful for sales targeting</li>
<li>Easy integration</li>
</ul>
<h3 id="datanyze-cons">Datanyze Cons</h3>
<ul>
<li>Higher cost for extensive usage</li>
<li>Pricing and usage limits</li>
</ul>
<h3 id="datanyze-pricing">Datanyze Pricing</h3>
<p>Datanyze offers a free trial for 90 days with 10 credits per month and plans start out at $29 per month after that.</p>
<h3 id="best-for_7">Best for</h3>
<p>Sales.</p>
<h2 id="11-lusha">11. Lusha</h2>
<p><img alt="Lusha's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/Lusha-s-homepage.png" /></p>
<p>Lusha's homepage</p>
<p>Lusha provides an API that enriches contact data with phone numbers, email addresses, company information, and more.</p>
<p>It's particularly useful for sales and marketing teams looking to improve their outreach efforts.</p>
<h3 id="lusha-pros">Lusha Pros</h3>
<ul>
<li>Detailed contact information</li>
<li>Easy integration</li>
<li>Strong customer support</li>
</ul>
<h3 id="lusha-cons">Lusha Cons</h3>
<ul>
<li>Higher cost</li>
<li>Data accuracy can vary</li>
</ul>
<h3 id="lusha-pricing">Lusha Pricing</h3>
<p>For API access, unfortunately, Lusha keeps things locked down behind a sales team. It isn't included in their standard plans, only enterprise.</p>
<h3 id="best-for_8">Best for</h3>
<p>Sales outreach and marketing teams.</p>
<h2 id="12-data-axle-formerly-infogroup">12. Data Axle (Formerly InfoGroup)</h2>
<p><img alt="Data Axle's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de11.png" /></p>
<p>Data Axle's homepage</p>
<p>Data Axle offers a range of data enrichment APIs that provide detailed business and consumer information.</p>
<p>It helps businesses improve their data quality and gain deeper insights into their customers and prospects.</p>
<h3 id="data-axle-pros">Data Axle Pros</h3>
<ul>
<li>Extensive business and consumer data</li>
<li>Easy integration</li>
<li>Real-time updates</li>
</ul>
<h3 id="data-axle-cons">Data Axle Cons</h3>
<ul>
<li>Data accuracy can vary</li>
</ul>
<h3 id="data-axle-pricing">Data Axle Pricing</h3>
<p>Data Axle offers a free trial and starts at $25 per month.</p>
<h3 id="best-for_9">Best for</h3>
<p>Business and consumer information.</p>
<h2 id="13-coresignal">13. Coresignal</h2>
<p><img alt="Coresignal's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de12.png" /></p>
<p>Coresignal's homepage</p>
<p>Coresignal offers a data enrichment API that provides information on individuals and companies.</p>
<p>It provides a general enrichment experience.</p>
<h3 id="coresignal-pros">Coresignal Pros</h3>
<ul>
<li>Comprehensive person and company data</li>
<li>Easy integration</li>
</ul>
<h3 id="coresignal-cons">Coresignal Cons</h3>
<ul>
<li>Higher cost</li>
<li>Data accuracy can vary</li>
</ul>
<h3 id="coresignal-pricing">Coresignal Pricing</h3>
<p>Coresignal has a 14-day free trial then starts at $49 per month.</p>
<h3 id="best-for_10">Best for</h3>
<p>General data enrichment.</p>
<h2 id="14-snovio">14. Snov.io</h2>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de13-2.png" /></p>
<p>Snov.io offers a data enrichment API that provides information on companies and contacts. It's definitely sales-focused.</p>
<h3 id="snovio-pros">Snov.io Pros</h3>
<ul>
<li>Detailed lead information</li>
<li>Easy integration</li>
<li>Good user experience</li>
</ul>
<h3 id="snovio-cons">Snov.io Cons</h3>
<ul>
<li>Higher cost for extensive usage</li>
<li>Data accuracy can vary</li>
</ul>
<h3 id="snovio-pricing">Snov.io Pricing</h3>
<p>Snov.io offers a free tier with limited requests. Paid plans start at $30 per month.</p>
<h3 id="best-for_11">Best for</h3>
<p>Lead generation and outreach efforts.</p>
<h2 id="15-leadgenius">15. LeadGenius</h2>
<p><img alt="LeadGenius' homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de14.png" /></p>
<p>LeadGenius' homepage</p>
<p>LeadGenius provides up-to-date business information through its data enrichment API.</p>
<h3 id="leadgenius-pros">LeadGenius Pros</h3>
<ul>
<li>Extensive business data</li>
<li>Easy to integrate</li>
</ul>
<h3 id="leadgenius-cons">LeadGenius Cons</h3>
<ul>
<li>High cost</li>
<li>Data accuracy can vary</li>
</ul>
<h3 id="leadgenius-pricing">LeadGenius Pricing</h3>
<p>LeadGenius offers custom pricing based on usage and needs. A free trial is available, but they mostly route you through their sales department. LeadGenius is one of the more expensive options on this list.</p>
<h3 id="best-for_12">Best for</h3>
<p>General enrichment.</p>
<h2 id="16-mattermark">16. Mattermark</h2>
<p><img alt="Mattermark's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de15.png" /></p>
<p>Mattermark's homepage</p>
<p>Mattermark offers a data enrichment API that provides information on companies and contact information.</p>
<h3 id="mattermark-pros">Mattermark Pros</h3>
<ul>
<li>Detailed company and contact data</li>
<li>Easy integration</li>
</ul>
<h3 id="mattermark-cons">Mattermark Cons</h3>
<ul>
<li>Higher cost</li>
<li>Limited data available</li>
</ul>
<h3 id="mattermark-pricing">Mattermark Pricing</h3>
<p>Mattermark offers a free trial then starts at $99 per month.</p>
<h3 id="best-for_13">Best for</h3>
<p>Enriching companies, or finding contact information.</p>
<h2 id="17-crunchbase">17. Crunchbase</h2>
<p><img alt="Crunchbase's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de16.png" /></p>
<p>Crunchbase's homepage</p>
<p>Crunchbase provides a data enrichment API that offers information on startups and companies.</p>
<h3 id="crunchbase-pros">Crunchbase Pros</h3>
<ul>
<li>Extensive information on companies and startups</li>
<li>Useful for market research</li>
<li>Easy integration</li>
</ul>
<h3 id="crunchbase-cons">Crunchbase Cons</h3>
<ul>
<li>Higher cost</li>
</ul>
<h3 id="crunchbase-pricing">Crunchbase Pricing</h3>
<p>While the Crunchbase API works quite well, it requires an Enterprise plan, which is routed through the sales department and can vary in pricing.</p>
<h3 id="best-for_14">Best for</h3>
<p>Company data, funding data, and market trends.</p>
<h2 id="18-hg-insights">18. HG Insights</h2>
<p><img alt="HG Insights' homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de17.png" /></p>
<p>HG Insights' homepage</p>
<p>HG Insights offers a data enrichment API that provides technographic data, helping businesses understand the technology landscape of their prospects and customers.</p>
<h3 id="hg-insights-pros">HG Insights Pros</h3>
<ul>
<li>Extensive technographic data</li>
<li>Useful for sales targeting</li>
<li>Easy integration</li>
</ul>
<h3 id="hg-insights-cons">HG Insights Cons</h3>
<ul>
<li>Higher cost</li>
</ul>
<h3 id="hg-insights-pricing">HG Insights Pricing</h3>
<p>HG Insights offers custom pricing based on usage and needs, and everything is routed through their sales department. However, Vendr claims the price can reach up to around $350,000 at the highest.</p>
<h3 id="best-for_15">Best for</h3>
<p>Technographic insights.</p>
<h2 id="19-leadspace">19. Leadspace</h2>
<p><img alt="Leadspace's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de18.png" /></p>
<p>Leadspace's homepage</p>
<p>Leadspace provides a data enrichment API that offers detailed information on companies and contacts.</p>
<h3 id="leadspace-pros">Leadspace Pros</h3>
<ul>
<li>Comprehensive data on companies and contacts</li>
<li>Real-time updates</li>
<li>Easy integration</li>
</ul>
<h3 id="leadspace-cons">Leadspace Cons</h3>
<ul>
<li>Higher cost</li>
<li>Data accuracy can vary</li>
</ul>
<h3 id="leadspace-pricing">Leadspace Pricing</h3>
<p>Leadspace offers custom pricing based on usage and needs, and everything is routed through their sales department.</p>
<h3 id="best-for_16">Best for</h3>
<p>General enrichment, CRM enrichment.</p>
<h2 id="20-melissa">20. Melissa</h2>
<p><img alt="Melissa's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/06/de19.png" /></p>
<p>Melissa's homepage</p>
<p>Melissa provides a data enrichment API that offers business and consumer information.</p>
<p>It helps businesses improve their data quality and ensure data accuracy through verification processes.</p>
<h3 id="melissa-pros">Melissa Pros</h3>
<ul>
<li>Strong focus on data quality and verification</li>
<li>Comprehensive data coverage</li>
<li>Easy integration</li>
</ul>
<h3 id="melissa-cons">Melissa Cons</h3>
<ul>
<li>Higher cost</li>
<li>Limited contact data</li>
</ul>
<h3 id="melissa-pricing">Melissa Pricing</h3>
<p>Melissa uses a credit-based system and offers 1,000 credits upon creating your account and a pay-as-you-go system thereafter depending on your needs.</p>
<h3 id="best-for_17">Best for</h3>
<p>Data quality and verification.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Proof of concepts are great until production hits. What looked like 60% accuracy dropped to the 40s, taking months to clean data and regain 80-90% accuracy. Data quality is revealed in production, not just in POCs. <a href="https://t.co/g5CdOmN58v?ref=nubela.co">https://t.co/g5CdOmN58v</a></p>&mdash; Docsie.io (@likalo_llc) <a href="https://x.com/likalo_llc/status/2055952257384849636?ref=nubela.co">Sun May 17 10:03:10 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2 id="the-bottom-line">The bottom line</h2>
<p>Data enrichment APIs are still invaluable if your business runs on outbound, research, lead scoring, fraud prevention, or CRM hygiene.</p>
<p>But I would not pick a <strong>data enrichment API</strong> now the same way I would have a few years ago. I care more about freshness, API ergonomics, self-serve onboarding, and whether the product helps me act on the data after enrichment.</p>
<p>That is why this list needed an update.</p>
<p>Proxycurl belonged on the old version of this article, and I'm not going to pretend it didn't. But Proxycurl has been sunset. The newer platform to look at is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, especially if you want enrichment plus company, customer, competitor, and monitoring data in one place.</p>
<p>If your use case is narrow, this list should help you pick the right specialist. If your use case is broader and you are tired of stitching five vendors together, start with NinjaPear and see if it fits how your team actually works.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ We are serious about purchasing credits. However, I need more trial credits for evaluation. Are you able to provide us with more trial credits? ]]></title>
        <description><![CDATA[ Do you have a budget of $10 for testing the service? If so, are you able to head over to the dashboard and make a top-up? $10 will yield you more than enough credits for you to evaluate the service.


In our early days, we offered free trial credits to ]]></description>
        <link>https://nubela.co/blog/we-are-serious-about-purchasing-credits-however-i-need-more-trial-credits-for-evaluation-are-you-able-to-provide-us-with-more-trial-credits/</link>
        <guid isPermaLink="false">609a5989418c82000107dc00</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Sat, 01 Jun 2024 18:17:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_399.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Do you have a budget of <code>$10</code> for testing the service? If so, are you able to head over to the dashboard and make a top-up? <code>$10</code> will yield you more than enough credits for you to evaluate the service.</p>
<p>In our early days, we offered free trial credits to everyone that asked. It turned out that almost everyone that we gave additional free "evaluation" credits never followed up with a purchase.</p>
<p>On the flip side, serious customers have never hesitated to make a small top-up for evaluation.</p>
<p>We do not provide trial credits beyond the first <code>10</code> credits that are added into your account when you first register an account.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Announcing Fresh Facebook and X/Twitter Profile Data in Person Profile Endpoint ]]></title>
        <description><![CDATA[ In the heels of our recent announcement of the all-new Customer API, I am happy to share that we will now return fresh profile data for Facebook or Twitter/X profiles via the Person Profile Endpoint (provided that the use_cache=if-recent parameter is included).


Here is a quick demo ]]></description>
        <link>https://nubela.co/blog/announcing-fresh-facebook-and-x-twitter-profile-data-in-person-profile-endpoint/</link>
        <guid isPermaLink="false">664b0c2f0f752400017787e8</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 20 May 2024 16:52:31 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>In the heels of our <a href="https://nubela.co/blog/introducing-proxycurls-customer-api/">recent announcement of the all-new Customer API</a>, I am happy to share that we will now return <strong>fresh</strong> profile data for Facebook or Twitter/X profiles via the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">Person Profile Endpoint</a> (provided that the <a href="https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/"><code>use_cache=if-recent</code> parameter is included</a>).</p>
<p>Here is a quick demo of myself enriching our Twitter/X profile of <code>https://twitter.com/proxycurl</code>:</p>
<pre><code class="language-bash">$ curl --location 'https://nubela.co/proxycurl/api/v2/Professional Social Network?twitter_profile_url=https%3A%2F%2Ftwitter.com%2Fproxycurl&amp;use_cache=if-recent' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer &lt;API_KEY&gt;'
</code></pre>
<p>Here is the profile data:</p>
<pre><code class="language-json">{
    "public_identifier": "https://www.twitter.com/in/proxycurl",
    "profile_pic_url": "https://pbs.twimg.com/profile_images/1394135315959353345/y4KnR6HH_normal.jpg",
    "background_cover_image_url": "https://pbs.twimg.com/profile_banners/1390489918120488960/1679300989",
    "first_name": "Proxycurl",
    "last_name": null,
    "full_name": "Proxycurl",
    "follower_count": 139,
    "occupation": null,
    "headline": null,
    "summary": "Proxycurl is a B2B enrichment API to fetch fresh and rich data on People and Companies 🚀",
    "country": null,
    "country_full_name": null,
    "city": "",
    "state": null,
    "experiences": null,
    "education": null,
    "languages": null,
    "accomplishment_organisations": null,
    "accomplishment_publications": null,
    "accomplishment_honors_awards": null,
    "accomplishment_patents": null,
    "accomplishment_courses": null,
    "accomplishment_projects": null,
    "accomplishment_test_scores": null,
    "volunteer_work": null,
    "certifications": null,
    "connections": null,
    "people_also_viewed": [
        {
            "link": "https://www.twitter.com/in/RuangHealing",
            "name": "Ruang Healing",
            "summary": null,
            "location": null
        },
        {
            "link": "https://www.twitter.com/in/ReceinAja",
            "name": "Recein Aja",
            "summary": "Apa aja ada. | kerjasama WA 📩 https://t.co/jQCywcTUTo | Submit DM",
            "location": "Indonesia"
        }, ... // truncated
    ],
    "recommendations": null,
    "activities": null,
    "similarly_named_profiles": null,
    "articles": null,
    "groups": null,
    "skills": null,
    "inferred_salary": null,
    "gender": null,
    "birth_date": null,
    "industry": null,
    "extra": null,
    "interests": [],
    "personal_emails": [],
    "personal_numbers": []
}
</code></pre>
<h2 id="what-is-different">What is different?</h2>
<p>We first announced support for a user to <a href="https://nubela.co/blog/profile-enrichment-via-facebook-twitter-comes-to-proxycurl/">provide for a <code>facebook_profile_url</code> or a <code>twitter_profile_url</code> input in the Person Profile Endpoint in August 2023</a>. Until this change, what we did was that when a Facebook or Twitter/X profile URL is provided, we tried to match it to a corresponding Professional Social Network member profile, and then returned profile data for that Professional Social Network profile.</p>
<p>The problem was that:</p>
<ul>
<li>not everyone on Twitter/X/Facebook has a Professional Social Network profile</li>
<li>we were not able to match a lot of Twitter/X/Facebook profiles to their Professional Social Network profiles</li>
</ul>
<p>For these cases for which we were not able to match a Professional Social Network profile, we had to return <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#proxycurl-overview-errors">an error of 404</a> -- which was just not good user experience.</p>
<hr>
<p>With this update, we will now be able to <strong>enrich all profiles with fresh publicly available data</strong> even if we are not able to match a Twitter/X/Facebook profile to a Professional Social Network profile.</p>
<h2 id="give-it-a-spin">Give it a spin!</h2>
<p>Throw in your personal Facebook or Twitter/X profile and see how our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">Person Profile Endpoint</a> handles it! Do not be surprised if we return more data than what you have publicly available because we do mix and match data across sources.</p>
<p>If you have any questions at all, send us an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Automate Cold Calling Lead Generation ]]></title>
        <description><![CDATA[ Learn how to programmatically find prospects, and enrich your existing prospects with accurate contact information and more. ]]></description>
        <link>https://nubela.co/blog/automate-cold-calling-lead-generation/</link>
        <guid isPermaLink="false">6615c353dbfa05000105384b</guid>
        <category><![CDATA[ cold calling ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Mon, 06 May 2024 17:37:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_397.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Cold calling remains one of the most effective ways to reach potential customers and drive sales. However, the success of your cold calling efforts heavily relies on the quality and accuracy of your prospecting data. And sourcing quality B2B data isn't easy.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/sales</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/brunchsquad1223</span>
<span style="color:#878a8c;">· ▲ 456</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">You need better data if your connection rate is ~4%</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/sales/comments/xk6262/cold_calling_will_be_a_thing_of_the_past_in_the/ipc3elo/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>Manually sourcing contact information for your prospects is not only time-consuming but also often results in outdated or incorrect data.</p>
<p>You might spend 15 minutes searching the web only to end up with generic company phone numbers that lead to a dead end. And even if you do manage to find decision maker phone numbers, the process is hardly scalable.</p>
<p>Existing B2B data providers offer a solution, but they come with their own set of drawbacks. Subscription costs can be high, and the data quality isn't always reliable. You might end up paying a premium for bad data.</p>
<p>Also, traditional B2B data providers often lack the flexibility and integrability that modern sales teams need. Their data is typically siloed off in proprietary platforms like web applications or Google Chrome extensions, making it difficult to integrate into your existing workflows and sales tools.</p>
<p>The solution? Programmatic lead generation via API.</p>
<h2 id="what-is-an-api-and-how-can-it-help-with-cold-calling">What is an API and how can it help with cold calling?</h2>
<p>An API, or Application Programming Interface, is a set of protocols and tools that allow different software applications to communicate with each other.</p>
<p>With an API, you can automate the entire process of finding, enriching, and updating your prospects.</p>
<p>Imagine being able to automatically feed fresh leads directly into your CRM, enrich your existing database with up-to-date phone numbers, or trigger personalized outreach based on real-time data changes, and beyond.</p>
<p>With an API, all of this is possible.</p>
<h2 id="but-not-just-any-api-works">But not just any API works</h2>
<p>You need a B2B enrichment API. And not just any B2B enrichment API will give you fresh quality data for a cost-effective price.</p>
<p>That's where Proxycurl came in.</p>
<p>Proxycurl spent years doing the hard part: scraping a massive amount of B2B data and matching it up to identifiers, such as LinkedIn profiles, then offering that data through a REST API. With it, you could make <code>HTTP</code> requests to retrieve specific data points, such as a prospect's direct phone number, email address, job title, company information, and more.</p>
<p>You could also use the API to search for prospects based on specific criteria, such as industry, location, job title, or beyond.</p>
<p>Let me explain how:</p>
<h2 id="programmatically-enrich-your-existing-prospects-with-contact-information">Programmatically enrich your existing prospects with contact information</h2>
<p>For starters, with the Personal Contact Number Lookup Endpoint, which was part of Proxycurl's Contact API, you could enrich social media profiles (LinkedIn, X, Facebook) with their respective personal phone numbers.</p>
<p>No more guessing games or leaving voicemails that never get returned, just a direct line to the people you need to talk to.</p>
<p>There were several ways to query the API, any programming language of your choice, but one of the easiest ways was to use a simple <a href="https://curl.se/?ref=nubela.co">cURL</a> <code>GET</code> command such as follows:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer Your_API_Key_Here&quot; \
    'https://nubela.co/proxycurl/api/contact-api/personal-contact' \
    --data-urlencode 'linkedin_profile_url=https://linkedin.com/in/elon-musk' \
    --data-urlencode 'page_size=0'
</code></pre>
<p>cURL can be easily installed, and may already be depending on your operating system, and used on macOS, Linux, and Windows.</p>
<p>After cURL made an HTTP <code>GET</code> request to the Personal Contact Number Lookup Endpoint, it then returned a phone number:</p>
<pre><code class="language-json">{
  &quot;numbers&quot;: [
    &quot;+1123123123&quot;
  ]
}
</code></pre>
<p>You could do many, or even thousands of profiles at the same time. ChatGPT, some simple Python, and a <code>CSV</code> file could accomplish it for you.</p>
<p>Not bad, right? It didn't take being a rocket scientist either.</p>
<blockquote>
<p><strong>Important update:</strong> Proxycurl has since been sunset, and Sapiengraph is no more as well. The same founder behind Proxycurl is now building NinjaPear. If your workflow depends on direct phone numbers specifically, this old Proxycurl flow is useful historical context, but NinjaPear is the current platform and it does <strong>not</strong> provide phone numbers. What it does provide is fresher company and person enrichment from public sources, verified work emails, company monitoring, customer intelligence, and a spreadsheet-first prospecting workflow through <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a>.</p>
</blockquote>
<h2 id="we-can-also-help-with-finding-interesting-prospects">We can also help with finding interesting prospects</h2>
<p>Now, let's say rather than enriching an existing prospect you've already found, you want to find some new prospects. We can also help you with that.</p>
<p>Namely, the Person Search Endpoint helped here.</p>
<p>The Person Search Endpoint allowed you to search through an entire dataset of hundreds of millions of profiles and filter with several data points, such as:</p>
<ul>
<li>Job role</li>
<li>Education</li>
<li>Current company</li>
<li>Country, city</li>
<li>Skills</li>
<li>And beyond</li>
</ul>
<p>Using cURL again, let's say we're looking to target HR tech companies:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer Your_API_Key_Here&quot; \
    'https://nubela.co/proxycurl/api/v2/search/person/' \
    --data-urlencode 'country=US' \
    --data-urlencode 'current_role_title=hr OR human resources OR people OR talent' \
    --data-urlencode 'current_company_industry=Human Resources' \
    --data-urlencode 'current_company_employee_count_min=50' \
    --data-urlencode 'current_company_employee_count_max=5000' \
    --data-urlencode 'skills=recruiting OR talent acquisition OR employer branding OR diversity' \
    --data-urlencode 'page_size=10'
</code></pre>
<p>The above query would search the dataset and find you matching prospects that fit your search criteria, returning the results like follows:</p>
<pre><code class="language-json">{&quot;results&quot;: [{&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/fox-boswell-65874874&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/alice-jiaqi-wang-601777b4&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/angie-hughes-1bb661b8&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/ir-bistok-r-s-nadeak-829588107&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/devon-edmisten-02001468&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/geet-matharoo&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/darenwardatgluereply&quot;, &quot;profile&quot;: null, &quot;last_updated&quot;: null}]}
</code></pre>
<p>And continuing on, full of LinkedIn profile URLs, which you could then enrich with contact information like phone numbers from there using the respective Personal Contact Number Lookup Endpoint above.</p>
<p>Additionally, there were many different search parameters you could use with the Person Search Endpoint.</p>
<p>Such as enabling enrichment by using <code>enrich_profiles=enrich</code> which would instead of just returning LinkedIn profile URLs, also return a structured JSON result back of their LinkedIn profile such as this:</p>
<pre><code class="language-json">{&quot;results&quot;: [{&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/hemasri-nagaraj-923a56a3&quot;, &quot;profile&quot;: {&quot;public_identifier&quot;: &quot;hemasri-nagaraj-923a56a3&quot;, &quot;first_name&quot;: &quot;Hemasri&quot;, &quot;last_name&quot;: &quot;Nagaraj&quot;, &quot;full_name&quot;: &quot;Hemasri Nagaraj&quot;, &quot;occupation&quot;: &quot;Principal Consultant&quot;, &quot;summary&quot;: &quot;Associate Consultant - Talent Acquisition at AVTAR Career Creators&quot;, &quot;country&quot;: &quot;US&quot;}, &quot;last_updated&quot;: &quot;1970-01-01T00:00:00&quot;}, {&quot;linkedin_profile_url&quot;: &quot;https://www.linkedin.com/in/naman-kaur-573ba05a&quot;, &quot;profile&quot;: {&quot;public_identifier&quot;: &quot;naman-kaur-573ba05a&quot;, &quot;first_name&quot;: &quot;Naman&quot;, &quot;last_name&quot;: &quot;Kaur&quot;, &quot;full_name&quot;: &quot;Naman Kaur&quot;, &quot;occupation&quot;: &quot;Human Resources Recruiter at Elite Hr Practices&quot;, &quot;summary&quot;: &quot;IT Recruiter Elite HR Practices...&quot;, &quot;country&quot;: &quot;US&quot;}, &quot;last_updated&quot;: &quot;1970-01-01T00:00:00&quot;}]}
</code></pre>
<p>The profile example above containing <code>"occupation": "Human Resources Recruiter at Elite Hr Practices"</code> as a key data point, of course.</p>
<p>You can see all of the possibilities in terms of additional parameters available with the Person Search Endpoint on the documentation.</p>
<p>But finding the right prospects and their respective phone numbers is just the first step in cold calling.</p>
<p>To really maximize the results of your cold calling, you'll want to use the rich data available through your enrichment stack to personalize your cold calling outreach.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/LeadGeneration</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/Global_Memory2247</span>
<span style="color:#878a8c;">· ▲ 3</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">Honestly, I’ve found that if you already have old leads sitting in your CRM or spreadsheet that never converted, following up with those can be way more effective than constantly buying fresh lists. Less sketchy too.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/LeadGeneration/comments/1jx9yi1/how_to_get_phone_numbers_leads_without_paying_a/mmui0pi/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>If you're reading this in 2026 and beyond, this is where <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> becomes a plausible alternative in the workflow.</p>
<p>Not for phone numbers. It does not do that.</p>
<p>But for the rest of the pipeline, it is genuinely useful:</p>
<ul>
<li>profile enrichment from public sources</li>
<li>company profile data</li>
<li>verified work email finding</li>
<li>employee count</li>
<li>customer intelligence</li>
<li>competitor discovery</li>
<li>ongoing account monitoring through the <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a></li>
</ul>
<p>That matters because automating cold calling lead generation is not just about finding a number. It's about knowing <strong>who</strong> to call, <strong>why now</strong>, and <strong>what changed</strong> at the account before your rep dials.</p>
<p>If I were rebuilding this stack today, I would split it in two:</p>
<ol>
<li>a contact data layer for direct dials, if direct dials are mandatory for your motion</li>
<li>a richer context layer for timing, relevance, work email, company changes, and account prioritization</li>
</ol>
<p>NinjaPear fits the second bucket very well.</p>
<h2 id="using-personalization-for-the-ultimate-cold-call">Using personalization for the ultimate cold call</h2>
<p>One of the biggest mistakes sales reps make when cold calling is using a generic, one-size-fits-all script. In today's noisy sales landscape, that simply doesn't cut it anymore.</p>
<p>Prospects are bombarded with cold outreach every day. If you want to stand out and actually get them to engage, you need to demonstrate that you understand their specific situation and needs.</p>
<p>That's where the power of personalization comes in.</p>
<p>For example, let's say you're selling a marketing automation platform. With enrichment data, you can pull information like:</p>
<ul>
<li>Job title</li>
<li>Work history</li>
<li>Skills</li>
<li>Location</li>
<li>Summary of the individual</li>
<li>Education</li>
<li>The size and industry of their company</li>
<li>Recent company news and events</li>
<li>Beyond</li>
</ul>
<p>...and with these insights, you can tailor your pitch to speak directly to the prospect's challenges and goals.</p>
<p>So, instead of a generic opener like, <em>"Hi, I'm calling from MarketCo and we offer marketing automation software,"</em> you could say something like:</p>
<p><em>"Hi Sarah, I noticed that ACME Corp recently raised a Series B and is rapidly expanding its marketing team. Congrats. I imagine with that growth, implementing the right automation tools is probably a big priority for you right now. Many of our other clients in the SaaS space have found our platform really helpful for scaling personalized campaigns without adding headcount. I'd love to learn more about ACME's specific needs and share some relevant case studies. Do you have 15 minutes to chat next week?"</em></p>
<p>See the difference?</p>
<p>By using just a little bit of prospecting data in your script, you show that you've done your homework and understand their needs. You're not just pitching a product, you're offering targeted solutions to their problems.</p>
<p>And the more relevant and personalized your outreach, the more likely prospects are to actually engage and take a meeting.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We hired 5 SDRs last year.

Within 4 weeks, we let 3 of them go.

The 2 who stayed:

• Started at 1-3 booked appointments per day
• Now at 5-10 booked appointments per day

In the first 3 months of having setters at all, our positive-reply-to-appointment conversion tripled.

BEFORE SETTERS:

positive reply lands → email back → 24-hour response cycle → most cool off.

AFTER SETTERS:

positive reply lands → 2-minute email response → phone call within five minutes if a number exists → text message if no answer → most book.

Setting isn't as easy to systematize as cold email itself.

But it IS the no.1 lever you can use to book more calls.

Agencies running cold email without setters are leaving a TON of their booked-appointment potential on the table.</p>&mdash; Atishay (@axtalks) <a href="https://x.com/axtalks/status/2054199920253358130?ref=nubela.co">Tue May 12 14:00:00 +0000 2026</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>In fact while we're talking about enrichment, let me show you one more of the more notable endpoints here:</p>
<h2 id="general-prospect-enrichment">General prospect enrichment</h2>
<p>Outside of using the enrichment parameter on the Person Search Endpoint, if you already had a social media profile URL like a LinkedIn URL on your prospects, you could also use the Person Profile Endpoint to return structured and enriched data of your prospect.</p>
<p>And on this endpoint, if you're using <code>use_cache=if-present</code>, Proxycurl could guarantee it was scraped within 29 days, often live. It also had a <code>personal_contact</code> parameter, and if you chose to enable that, you could also pull their phone number through this endpoint as well.</p>
<p>Here's an example using cURL:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer Your_API_Key_Here&quot; \
    'https://nubela.co/proxycurl/api/v2/linkedin' \
    --data-urlencode 'linkedin_profile_url=https://linkedin.com/in/johnrmarty/' \
    --data-urlencode 'personal_contact_number=include' \
    --data-urlencode 'use_cache=if-recent' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>Which returns a similar JSON result, such as the Person Search Endpoint with the enrichment parameter, but also includes contact information:</p>
<pre><code class="language-json">{
  &quot;public_identifier&quot;: &quot;johnrmarty&quot;,
  &quot;first_name&quot;: &quot;John&quot;,
  &quot;last_name&quot;: &quot;Marty&quot;,
  &quot;full_name&quot;: &quot;John Marty&quot;,
  &quot;occupation&quot;: &quot;Co-Founder at FF Real Estate&quot;,
  &quot;country&quot;: &quot;US&quot;,
  &quot;city&quot;: &quot;Seattle&quot;,
  &quot;state&quot;: &quot;Washington&quot;,
  &quot;personal_numbers&quot;: [&quot;+19707495020&quot;]
}
</code></pre>
<p>It's safe to say it's pretty easy to get access to the B2B data you need.</p>
<p>Also, for a current-day alternative, NinjaPear now covers a good chunk of the non-phone enrichment side. On its homepage, NinjaPear explicitly offers profile enrichment, company profile data, verified work email finding, employee count, and customer intelligence, all pay-as-you-go with no monthly minimums. That's a different product shape from old Proxycurl, but for automating cold calling lead generation it is a pretty sane fit if your team is sourcing leads, prioritizing accounts, and teeing up reps with context before the call.</p>
<h2 id="how-to-get-the-most-out-of-your-cold-calling">How to get the most out of your cold calling</h2>
<h3 id="do-your-research">Do your research</h3>
<p>Before each call, take a few minutes to review the prospect's enriched data.</p>
<p>Look for key points that you can use to tailor your pitch, like recent company events, tech stack info, or industry-specific challenges.</p>
<p>If you are using a modern stack, this is where monitoring changes matters. A prospect who just raised, just hired a new VP, just changed pricing, or just launched a new product is a very different call from a random name on a stale list.</p>
<h3 id="prioritize-relevance-over-volume">Prioritize relevance over volume</h3>
<p>It's tempting to stuff your script with every piece of data you have on the prospect. But this can quickly become overwhelming and sound artificial.</p>
<p>Instead, pick the one or two most relevant points and focus on those. Quality over quantity.</p>
<h3 id="connect-the-dots">Connect the dots</h3>
<p>Don't just recite facts about the prospect's company. Use that information to draw explicit connections to your offering.</p>
<p>For instance, <em>"I see you use Salesforce CRM. Our integration with Salesforce allows you to automatically sync lead data and activity, which could save your reps hours per week."</em></p>
<h3 id="keep-it-conversational">Keep it conversational</h3>
<p>While a script is important, you don't want to sound like you're reading from a teleprompter.</p>
<p>Use your personalization data points as natural conversation starters, but be prepared to go off-script and actually listen to the prospect's responses.</p>
<p>By the way, generally speaking, a cold call should flow something like this:</p>
<ul>
<li>Intro, who you are, reason for calling</li>
<li>Value prop, how you help similar companies solve a relevant problem</li>
<li>Qualification, key questions to see if they're a fit</li>
<li>CTA, book a meeting, demo, next step</li>
<li>Objection handling, acknowledge concerns, pivot to value</li>
</ul>
<p>Be prepared to go off-script to address their unique needs. The goal is to start a dialog, not close on the first call.</p>
<h3 id="continue-reiterating">Continue reiterating</h3>
<p>Keep track of which talking points seem to resonate most with prospects, and which fall flat.</p>
<p>Over time, refine your cold calling script based on what's working. It's an iterative process.</p>
<p>Ultimately with a bit of targeting and research, instead of your cold calls getting brushed off as "just another sales call," you'll be able to start meaningful conversations that lead to real sales opportunities.</p>
<h2 id="recapping-things">Recapping things</h2>
<p>Throughout this article I talked about a lot of different ways a B2B enrichment API could help you with your cold calling. Let me recap them for you.</p>
<p>To begin with, you can use a person search endpoint to build targeted cold calling prospecting lists and surface fresh, accurate leads that fit your ideal customer profile.</p>
<p>These dynamically generated lists can then be automatically enriched with direct-dial phone numbers, verified emails, job titles, latest work details, and quite a few other B2B data points using enrichment APIs like a Personal Contact Lookup and Person Profile endpoint.</p>
<p>Your existing CRM leads and downloaded lists can also be continuously enriched and kept up-to-date using these same types of API endpoints.</p>
<p>Additionally, you can set up workflows to identify warmer prospects ready for outreach based on activity signals, fresh funding news, job changes, and other trigger events, then automatically, and manually, conduct outreach.</p>
<p>That last piece is where NinjaPear is actually more interesting than the old world of static enrichment tools. NinjaPear is not a phone number product. But it does combine person enrichment, work email finding, customer data, competitor discovery, and company monitoring in one place. If your team cold calls based on timing and account movement, not just raw list volume, that's useful.</p>
<p>The key is to think of your API not as a separate tool, but as a core data layer that integrates into your B2B business.</p>
<h2 id="the-bottom-line">The bottom line</h2>
<p>Cold calling may be a tried-and-true sales tactic from the old days, but in today's competitive and jaded landscape, it's not enough to simply dial through a list of prospects.</p>
<p>To truly excel at cold calling, you need accurate contact information, fresh data on your prospects, personalized outreach, and a focus on delivering value.</p>
<p>Proxycurl used to make the phone-number-and-enrichment side much easier. Today, if you are rebuilding the motion, I would think in layers.</p>
<ul>
<li>direct dial data, if your team truly needs phone numbers</li>
<li>profile and company enrichment</li>
<li>work email coverage</li>
<li>account change monitoring</li>
<li>CRM sync and workflow automation</li>
</ul>
<p>That said, tools in the mold of the old Proxycurl endpoints, such as a Person Search Endpoint, a Person Profile Endpoint, and a Personal Contact Number Lookup Endpoint, are still the right conceptual building blocks.</p>
<p>And if you want the modern Nubela answer, it's NinjaPear for the enrichment, monitoring, and competitive-intel side of the stack.</p>
<h2 id="try-the-modern-stack">Try the modern stack</h2>
<p>If you're trying to automate cold calling lead generation today, don't just buy a giant list and hope reps muscle it into pipeline. Build a small workflow first.</p>
<p>Start with account selection. Add person enrichment. Layer in verified work emails and company-change monitoring. Then decide whether direct dials are actually the constraint, or whether your real problem is stale timing and weak context.</p>
<p>If you want the current platform from the team behind Proxycurl, try NinjaPear's 3-day free trial and test whether its enrichment, work email, customer data, and monitoring actually improve your call prep and targeting. That's the sane next step.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Proxycurl&#x27;s Customer API ]]></title>
        <description><![CDATA[ I am pleased to announce that the Customer API is now available in production on Proxycurl. The Customer API enables you to retrieve a list of customers and followers of any company.


Let&#39;s see it in action. It is no secret that People Data Labs (PDL) is one ]]></description>
        <link>https://nubela.co/blog/introducing-proxycurls-customer-api/</link>
        <guid isPermaLink="false">66263223c7d8a00001137229</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Mon, 22 Apr 2024 17:48:47 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>I am pleased to announce that the <a href="https://pxlcl.co/customer-api?ref=nubela.co">Customer API</a> is now available in production on Proxycurl. The Customer API enables you to retrieve a list of customers and followers of any company.</p>
<p>Let's see it in action. It is no secret that People Data Labs (PDL) is one of our competitors. So, let's attempt to fetch some customers of PDL with the Customer API:</p>
<pre><code class="language-bash">$ curl --location 'https://nubela.co/proxycurl/api/customers?Professional Social Network_company_profile_url=https%3A%2F%2Fwww.professionalsocialnetwork.com%2Fcompany%2Fpeopledatalabs%2F&amp;page_size=10' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer &lt;YOUR_API_KEY&gt;'
</code></pre>
<p>I requested 10 customers of PDL, and here's a sample of the results:</p>
<pre><code class="language-json">{
  "companies": [
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/iinet",
      "twitter_profile_url": "https://twitter.com/iinet",
      "email": "support@iinet.net.au"
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/iinet",
      "twitter_profile_url": "https://twitter.com/iinet",
      "email": "info@intersight.iinet.net.au"
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/cisco",
      "twitter_profile_url": "https://twitter.com/ciscosystems",
      "email": null
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/cisco",
      "twitter_profile_url": "https://twitter.com/cisco",
      "email": null
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/veterati",
      "twitter_profile_url": null,
      "email": null
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/marc-research",
      "twitter_profile_url": "https://twitter.com/marc_research",
      "email": "marketing@marcresearch.com"
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/bmc-software",
      "twitter_profile_url": "https://twitter.com/bmcsoftware",
      "email": null
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/inklingsf",
      "twitter_profile_url": "https://twitter.com/inkling",
      "email": null
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/future-super",
      "twitter_profile_url": "https://twitter.com/myfuturesuper",
      "email": null
    },
    {
      "Professional Social Network_company_profile_url": "https://www.professionalsocialnetwork.com/company/hudson-global",
      "twitter_profile_url": null,
      "email": null
    }
  ],
  "next_page": "https://nubela.co/proxycurl/api/customers?Professional Social Network_company_profile_url=https%3A%2F%2Fwww.professionalsocialnetwork.com%2Fcompany%2Fpeopledatalabs%2F&amp;page_size=10&amp;after=maestro-health"
}
</code></pre>
<p>We've taken the initiative to include contact information alongside the results, providing the general email address for each result (on a best-effort basis).</p>
<p>Upon a quick review of the results, we've identified some bugs. One glaring issue is the presence of duplicate results for both Cisco and iiNet. This is why the product is released with the <code>EXPERIMENTAL</code> tag, so please take note of that. If you happen to spot any bugs, please feel free to send an email to <a href="mailto:hello@nubela.co">hello@nubela.co</a>, and we'll address them promptly.</p>
<h2 id="cool-but-what-can-you-do-with-customer-data">Cool, but what can you do with Customer Data?</h2>
<p>Here's how we initially utilized the Customer API internally. In July 2023, we conducted a cold email campaign targeting 400 of PDL's customers, <a href="https://nubela.co/blog/people-data-labs-customers-get-25-000-proxycurl-credits-for-free/">offering them free credits</a>, which resulted in converting a couple of PDL customers. For us, the Customer API is invaluable for generating prospect lists for our BDR team.</p>
<p>There are countless potential use cases for customer data. As we collect more data on customer behaviors, we'll provide additional write-ups on <a href="https://nubela.co/proxycurl/use-cases?ref=nubela.co">use-cases</a> enabled by the Customer API.</p>
<h2 id="customer-api-endpoints">Customer API Endpoints</h2>
<p>Let's delve deeper into what exactly comprises the Customer API. Essentially, there are two types of data returned by the Customer API:</p>
<ol>
<li>Companies highly likely to be paying customers of a target company.</li>
<li>Individual followers of a target company.</li>
</ol>
<p>With that in mind, the API endpoints that constitute the Customer API revolve around these two data types.</p>
<ul>
<li><strong><a href="https://pxlcl.co/customer-listing-endpoint?ref=nubela.co">Customer Listing Endpoint</a></strong> returns a list of corporate customers of a target company.</li>
<li><strong><a href="https://pxlcl.co/customer-listing-count-endpoint?ref=nubela.co">Customer Listing Count Endpoint</a></strong> returns the total count of corporate customer results so you don't have to pay for all the results to understand the total count.</li>
<li><a href="https://pxlcl.co/follower-listing-endpoint?ref=nubela.co"><strong>Follower Listing Endpoint</strong></a> returns a list of individual followers of a target company.</li>
<li><a href="https://pxlcl.co/follower-listing-count-endpoint?ref=nubela.co"><strong>Follower Listing Count Endpoint</strong></a> returns the total count of individual followers of a target company that we have in the database.</li>
</ul>
<h2 id="how-does-it-work">How does it work?</h2>
<p>Without delving into technical details of the inner workings, I can describe the general heuristics involved in gathering customer data.</p>
<p>We began with a rich database of companies and individuals globally. Then, we started connecting the dots with signals that indicate a user is a paying customer of a target company.</p>
<p>For instance, as a publicly available customer signal, Proxycurl is a Slack customer because <code>nubelacorp.slack.com</code> is a publicly hosted site for our internal users. And <code>Nubela</code> is our legacy incorporated name. By connecting these dots, one might infer that Proxycurl is a customer of Slack.</p>
<p>Understanding this heuristic, you'd also realize that our method of gathering customers is not ideal for identifying customer churn. Even if Proxycurl stops using Slack, <code>nubelacorp.slack.com</code> would still be present.</p>
<h2 id="customer-data-coverage">Customer Data coverage</h2>
<p>Globally, there are tens of millions of companies. It's impractical to identify possible customers for all of them. Hence, we decided to prioritize the top 1M customers by employee count, a subset of company data easily retrieved with <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkDB</a>.</p>
<p>We're continually expanding the dataset, but as of April 22, 2024, here's what we have:</p>
<p><strong>Customer Listing Endpoint</strong></p>
<ul>
<li>Total coverage: 656,086 companies</li>
<li>Max single result: 34,515 customers</li>
<li>Average result: 109 customers</li>
</ul>
<p><strong>Follower Listing Endpoint</strong></p>
<ul>
<li>Total coverage: 1,111,249 companies</li>
<li>Max single result: 37,621 followers</li>
<li>Average result: 296 followers</li>
</ul>
<p>We further tested the dataset with 5000 <em>notable companies</em> (companies with at least 5000 employees) and found that:</p>
<ul>
<li>We have customer data for 67.1% of these notable companies.</li>
<li>We have follower data for 71.2% of these notable companies.</li>
</ul>
<hr>
<p>This snapshot represents our progress, and these numbers will continue to grow over time as our coverage expands.</p>
<h2 id="how-is-customer-api-priced">How is Customer API priced?</h2>
<p>Understanding the process through which we acquire customer data, you'll notice that the Customer Dataset is a growing dataset where the core data remains relatively stable. This means that, for the most part, you'll only need to retrieve relevant customer data once. As a software business constantly iterating, if our users only engage with us once, we risk going out of business quickly.</p>
<p>Therefore, the Customer API is priced to encourage you, the customer, to commit to our platform for all kinds of B2B data, including Customer Data.</p>
<p>The Customer and Follower Listing Endpoints will cost <code>100</code> credits per result for casual customers and <code>10</code> credits per result for committed customers on an Annual/Enterprise plan. Please note that Annual Plans do not include those with monthly payment options. Moving forward, it will also be our policy to heavily favor customers who have committed to Proxycurl, offering them cheaper credits.</p>
<p>In the same vein, it will cost <code>1</code> credit to get a count for either followers or customers for committed users, and <code>10</code> credits for casual users.</p>
<h2 id="private-b2b-data-made-accessible">Private B2B Data, made accessible</h2>
<p>At Proxycurl, we are deeply focused on building private B2B datasets as our platform grows. By "private," we mean data that cannot be publicly scraped. We view Customer Data as a "Blue Ocean" dataset because no one else has such datasets, and we will be investing heavily in this area.</p>
<p>We have also identified Contact Data as another form of data that cannot be publicly scraped. It's in our roadmap to dramatically increase our coverage of work email addresses to encompass 80+% of all individuals on the planet. You can expect to hear about a significantly revamped and improved <a href="https://nubela.co/proxycurl/contact-api?ref=nubela.co">Contact API</a> in the coming quarters.</p>
<hr>
<p>Data accessibility is important to us. Proxycurl enables software engineers to access fresh and valuable B2B data via API calls. For those who do not code, we've developed <a href="https://sapiengraph.com/?utm_campaign=own_platforms&utm_source=proxycurl_website&utm_medium=platforms&utm_content=article_link">Sapiengraph</a> for you. I'm also pleased to announce that our Customer Data will soon be available on Sapiengraph through a web UI.</p>
<p>If you have any questions about the Customer API, feel free to send us an email at <a href="mailto:hello@nubela.co">hello@nubela.co</a>. I look forward to hearing from you!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ An Update To Proxycurl&#x27;s Free API Offerings ]]></title>
        <description><![CDATA[ We have to update our free API offerings due to bad actors abusing our free API offerings. As you already know, we have always offered a suite of free API endpoints that lets you

 1. check an email address to see if it is a disposable email, a free email, ]]></description>
        <link>https://nubela.co/blog/updates-to-proxycurls-free-api-offerings/</link>
        <guid isPermaLink="false">661fcc6cdbfa050001053950</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Wed, 17 Apr 2024 21:20:30 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>We have to update our free API offerings due to bad actors abusing our free API offerings. As you already know, we have always offered a suite of <a href="https://nubela.co/proxycurl/free-tools?ref=nubela.co">free API endpoints</a> that lets you</p><ol><li>check an email address to see if it is a disposable email, a free email, or a business email</li><li>get logos of any company</li><li>get profile pictures of any Professional Social Network member</li></ol><p>We offer these at no cost and anyone can literally sign up, and get access to it. We prioritize resources to those who pay, therefore the use of these free API services is <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#proxycurl-overview-rate-limit">rate limited based on your subscription level</a>. Regardless, anyone whether you are paying or not, gets access to it.</p><p>Sadly, some bad actors opted to spend time and resources recently creating hundreds of fake accounts to fraudulently gain an aggregated large rate limit and began abusing our free API services. Therefore to combat these bad actors, we have decided to update our free API offerings:</p><ul><li>The free API endpoints will only be unlocked after making at least one $10 top-up. Thereafter, the API endpoints will remain free perpetually. </li><li>Prior to the first top-up, the endpoints will cost <code>1</code> credit / successful request.</li></ul><p>We apologize for this change. I guess a small group of bad actors is why we, the general population, can't have nice things.</p><hr><p>On a separate note: if you are a business owner suffering from having your free trial or free services abused with fake new accounts, then you might find our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-disposable-email-address-check-endpoint" rel="noreferrer">Disposable Email Checker API</a> very helpful. It is free too! (The caveat is that you have to make a one-time $10 payment to unlock the free tier.)</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Get a Professional Social Network Profile’s Contact Information Programmatically ]]></title>
        <description><![CDATA[ Learn how to find the contact information of any given Professional Social Network profile programmatically with our B2B enrichment API. ]]></description>
        <link>https://nubela.co/blog/get-a-linkedin-profiles-contact-information/</link>
        <guid isPermaLink="false">65fcb02b8cc97e0001c8a4b2</guid>
        <category><![CDATA[ contact api ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Tue, 09 Apr 2024 18:00:56 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Many businesses use Professional Social Network for prospecting and outreach because of the massive amounts of B2B data available on it, but it can be rather challenging and expensive.</p>
<p>On one hand, Professional Social Network's native solutions like InMail messages are designed to keep you on their platform, rather than natively integrating with your workflow because it's more expensive for you, and more profitable for them.</p>
<p>And then, on the other hand, [third-party solutions like Professional Social Network messaging/outreach automation tools and browser extensions](<a href="https://nubela.co/blog/best-Professional">https://nubela.co/blog/best-Professional</a> Social Network-automation-tools/) don't scale well and include the risk of getting banned from the platform.</p>
<p>The next option is scraping data from Professional Social Network yourself, but that comes with its share of headaches too like constantly rotating proxies, Professional Social Network accounts, and always having to update your scraper to keep it working.</p>
<p>So, you're basically, stuck between a rock and a hard place.</p>
<p>Unless, of course, you had a way to programmatically access all of the B2B data you could ever need without having to scrape a single thing yourself or download any browser extensions...</p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Note:</strong></b> <a href="https://nubela.co/blog/get-a-Professional%20Social%20Network-profiles-contact-information/#download-the-contact-enrichment-demo" rel="noreferrer">You can click right here</a> to skip to the section where you can download a working Python demo that uses our Contact API to enrich Professional Social Network profile URLs with contact information.</div></div>
<!--kg-card-begin: html-->
<img class="Sirv" data-src="https://crandolph.sirv.com/Images/main_large.gif" alt="">
<script src="https://scripts.sirv.com/sirvjs/v3/sirv.js"></script>
<!--kg-card-end: html-->
<h2 id="meet-proxycurl-a-b2b-enrichment-api">Meet Proxycurl, a B2B enrichment API</h2>
<p>Hi! That's us.</p>
<p>We've already done the hard part for you by scraping over 472 million Professional Social Network profiles ([we call our Professional Social Network dataset LinkDB](<a href="https://nubela.co/blog/linkdb-Professional">https://nubela.co/blog/linkdb-Professional</a> Social Network-dataset-with-people-and-company-profiles/)) and enriching it with external sources.  We make B2B data easy.</p>
<p>All you need to do is request the data from our API (application programming interface, ELI5 definition: a fast food menu for data), and you're free to do whatever you want with it. You can even natively integrate our API into your outreach systems and automate the whole process.</p>
<p>When it comes to contact information enrichment specifically, our <a href="https://nubela.co/proxycurl/contact-api?ref=nubela.co">Contact API</a> provides a programmatic and cost-effective way to enrich a profile/prospect with verified work emails, personal emails, contact numbers, and more.</p>
<p>By integrating our API into your existing workflow, you can:</p>
<ul>
<li>Access verified personal/work emails and contact numbers</li>
<li>Enrich your existing leads with accurate and up-to-date information</li>
<li>Scale your outreach efforts without the need for manual data entry</li>
<li>Save time and money compared to using Professional Social Network's native tools</li>
</ul>
<h2 id="how-to-request-b2b-data-from-our-professional-social-network-api">How to request B2B data from our Professional Social Network API</h2>
<p>There are many different ways you can request data from an API, like cURL, Python or JavaScript, but regardless all of these different ways revolve around making HTTP requests.</p>
<p>Continuing on from the ELI5 fast food menu example from earlier, HTTP requests are like the different ways you can order your food or ask about it.</p>
<p>You can <code>GET</code> (ask for the menu), <code>POST</code> (order something), <code>PUT</code> (change your order), <code>DELETE</code> (cancel your order), and a few more. These requests are the standard way the internet talks; it's the language of web browsers and servers.</p>
<p>cURL is a tool available on Linux, macOS, and Windows used to transfer data to or from a server, and and is one of the easiest ways to request data, so we'll start with that.</p>
<p>In the case of cURL, it's like a messenger you can send to the restaurant (server) with a specific note (request).</p>
<p>The note says things like "Please tell me what pizzas you have" or "I want one large pepperoni pizza". cURL knows how to talk to the restaurant no matter what language they speak or what dishes they serve. It's versatile and can send messages to any restaurant (server) in the world as long as you know the address (URL) and what you want to order (the request method and data).</p>
<h3 id="how-to-get-personal-email-addreses-from-professional-social-network-profiles">How to get personal email addreses from Professional Social Network profiles</h3>
<p>Using cURL, we can request the personal email address from a given Professional Social Network profile with our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-personal-email-lookup-endpoint">Personal Email Lookup Endpoint</a>.</p>
<p>Here's how:</p>
<pre><code class="language-python">curl \
    -G \
    -H "Authorization: Bearer ${YOUR_API_KEY}" \
    'https://nubela.co/proxycurl/api/contact-api/personal-email' \
    --data-urlencode 'Professional Social Network_profile_url=https://professionalsocialnetwork.com/in/williamhgates' \
    --data-urlencode 'email_validation=include' \
    --data-urlencode 'page_size=0'
</code></pre>
<p>Which would return a <code>JSON</code> result such as this:</p>
<pre><code class="language-json">{"emails":[],"invalid_emails":["bill.gates@gatesfoundation.org""]}
</code></pre>
<p>In this case, the email is invalid because it's not a personal email but rather charity/business.</p>
<p>You could <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">sign up for a Proxycurl account here and test out this cURL request yourself</a>. After creating your account you'll receive 10 free credits.</p>
<p>By the way, the above cURL command is using <code>GET</code> which is declared by the <code>-G</code>.</p>
<h3 id="how-to-get-personal-phone-numbers-from-professional-social-network-profiles">How to get personal phone numbers from Professional Social Network profiles</h3>
<p>Similar to our Personal Email Lookup Endpoint, a simple cURL request to our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-reverse-contact-number-lookup-endpoint">Personal Contact Number Lookup Endpoint</a> with a given Professional Social Network profile URL will allow you to receive a phone number back in return.</p>
<p>Here's how:</p>
<pre><code class="language-python">curl \
    -G \
    -H "Authorization: Bearer ${YOUR_API_KEY}" \
    'https://nubela.co/proxycurl/api/contact-api/personal-contact' \
    --data-urlencode 'Professional Social Network_profile_url=https://professionalsocialnetwork.com/in/williamhgates' \
    --data-urlencode 'page_size=0'
</code></pre>
<p>Which would return a <code>JSON</code> result such as this:</p>
<pre><code class="language-json">{"numbers": [+13334248181]}% 
</code></pre>
<h3 id="how-to-get-work-emails-from-professional-social-network-profiles">How to get work emails from Professional Social Network profiles</h3>
<p>Finally, last, but not least, our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-work-email-lookup-endpoint">Work Email Lookup Endpoint</a> is our API endpoint that allows you to retrieve the work email address associated with a given Professional Social Network profile URL.</p>
<p>It works a bit differently from the other two because it will only return the data to a webhook. For testing, there are free services out there like <a href="https://webhook.site/?ref=nubela.co">webhook.site</a>. Other than that, it's the same.</p>
<p>Here's how we could request a work email with cURL:</p>
<pre><code class="language-python">curl \
    -G \
    -H "Authorization: Bearer ${YOUR_API_KEY}" \
    'https://nubela.co/proxycurl/api/Professional Social Network/profile/email' \
    --data-urlencode 'Professional Social Network_profile_url=https://professionalsocialnetwork.com/in/williamhgates' \
    --data-urlencode 'callback_url=	https://webhook.site/0a0a6db2-6593-4bdc-bfa5-cc85dc9303ca'
</code></pre>
<p>Which will immediately return <code>JSON</code> back with your work email queue count:</p>
<pre><code class="language-json">{"email_queue_count": 1}%  
</code></pre>
<p>And then send the work email to your webhook:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/04/webhook-results.png" class="kg-image" alt="My Webhook.site response received back after the work email is enriched" loading="lazy" width="1580" height="509"><figcaption><span style="white-space: pre-wrap;">My Webhook.site response received back after the work email is enriched</span></figcaption></figure><h2 id="we-even-built-a-demo-to-show-you-how-to-enrich-contacts">We even built a demo to show you how to enrich contacts</h2>
<p>To demonstrate the capabilities of our Contact API (because we believe in showing and not just telling), I've developed a simple B2B contact enrichment demo application using <a href="https://www.djangoproject.com/?ref=nubela.co">Django</a> and <a href="https://www.python.org/?ref=nubela.co">Python</a>:</p>

<!--kg-card-begin: html-->
<img class="Sirv" data-src="https://crandolph.sirv.com/Images/main_large.gif" alt="">
<script src="https://scripts.sirv.com/sirvjs/v3/sirv.js"></script>
<!--kg-card-end: html-->
<p>It allows you to:</p>
<ul>
<li>Enter a Professional Social Network profile URL and enrich it with verified [work email addresses](<a href="https://skrapp.io/Professional?ref=nubela.co">https://skrapp.io/Professional</a> Social Network), personal email addresses, and phone numbers.</li>
<li>Import Professional Social Network profile URLs in bulk using a CSV file, making it easy to process large numbers of profiles simultaneously.</li>
<li>Store enriched contact information in a SQLite database, providing a persistent and easily accessible storage solution.</li>
<li>Export enriched contact data as a CSV file, allowing you to easily import the data into your existing CRM or marketing automation tools.</li>
<li>View and search enriched contact information through a user-friendly web interface, making it simple to find and manage the data you need.</li>
</ul>
<p>While this application is intended as a demo, it could indeed be used locally in production or slightly altered (such as implementing authentication logic so random individuals couldn't use it publicly and changing out the development Django web server) and used between an entire team.</p>
<p>Once adding things like authentication, you could further integrate something like Stripe's API and build a full-blown SaaS tool. Accomplishing this is pretty easy with Django's framework.</p>
<h3 id="download-the-contact-enrichment-demo">Download the contact enrichment demo</h3>
<p>The application is entirely open source, and you can download it below:</p>

<!--kg-card-begin: html-->
<p></p><form class="stylized-form" action="https://sendy.nubela.co/subscribe" method="POST" accept-charset="utf-8">
	<label for="name">Enter your first name:</label><br/>
	<input type="text" name="name" id="name"/>
	<br/>
    <br>
	<label for="email">Enter your email:</label><br/>
	<input type="email" name="email" id="email"/><br/><div style="display:none;">
	<label for="hp">HP</label><br/>
	<input type="text" name="hp" id="hp"/>
	</div>
	<input type="hidden" name="list" value="o9892fRkdePC919eJm9892Kiuw"/>
	<input type="hidden" name="subform" value="yes"/>
    <br>
    <input type="submit" name="submit" id="submit" value="Download the contact enrichment application"/>
</form>
<!--kg-card-end: html-->
<p>(Just check your email shortly after submitting the above form.)</p>
<h1 id="how-to-integrate-our-api-into-your-application">How to integrate our API into your application</h1>
<p>The rest of the article will be spent explaining how you can use our API in the background for your contact enrichment/outreach using the application as a demonstration.</p>
<p>That said, I've intentionally built the demo with Python as it's a very high level programming language that's easy to pick up, and easy to get help with from ChatGPT or Claude.</p>
<p>Regardless if you know zero code, you're somewhat experienced, or your a coding guru, you'll be able to find value out of this article.</p>
<p>We'll cover the following steps:</p>
<ol>
<li>[Setting up your development environment](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#setting-up-your-development-environment)</li>
<li>[Configuring ngrok for handling webhooks in local development](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#setting-up-ngrok-for-webhooks)</li>
<li>[Defining your data models for persistent storage](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#modelspy)</li>
<li>[Implementing your view functions](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#viewspy)</li>
<li>[Setting up URL patterns](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#urlspy)</li>
<li>[Creating HTML templates](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#styling-your-django-application)</li>
<li>[Running the application](<a href="https://nubela.co/blog/get-a-Professional">https://nubela.co/blog/get-a-Professional</a> Social Network-profiles-contact-information/#running-your-new-application)</li>
</ol>
<p>Let's dive in.</p>
<h2 id="setting-up-your-development-environment">Setting up your development environment</h2>
<h3 id="first-things-first-youll-need-a-python-ide">First things first, you'll need a Python IDE</h3>
<p>IDE stands for integrated development environment, which is a software suite that includes a code editor, compiler or interpreter, debugger, and build automation tools, streamlining the entire development process.</p>
<p>For Python, my favorite IDE is PyCharm, which advertises itself as, "the Python IDE for data science and web development," and <a href="https://www.jetbrains.com/pycharm/download/?ref=nubela.co">has a community edition available for free here</a>.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/04/pycharm-ui.png" class="kg-image" alt="PyCharm's user interface" loading="lazy" width="2000" height="1250"><figcaption><span style="white-space: pre-wrap;">PyCharm's user interface</span></figcaption></figure><p>If you don't have Python installed already, you can install it during the process of installing PyCharm as well.</p>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Note:</strong></b> If you're a student, you can get the "professional" PyCharm edition, which comes with a few more features for free through the <a href="https://education.github.com/pack?ref=nubela.co">GitHub Student Developer Pack</a>. Also, if you already have a Python IDE, you can of course skip installing PyCharm and use the tools you're familiar with. Just replace any of the following mentions of PyCharm with your IDE of choice.</div></div><h3 id="create-a-new-project">Create a new project</h3>
<p>Once PyCharm is installed, open it and select "File" &gt; "New Project". Choose a location for your project and give it a name (such as <code>contact_demo_app</code>).</p>
<p>In the new project window, ensure that the "Virtualenv" option is selected under the interpreter section. PyCharm will automatically use the bundled Python interpreter:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/py-1.png" class="kg-image" alt="PyCharm's virtual environment option" loading="lazy" width="1600" height="1300"><figcaption><span style="white-space: pre-wrap;">PyCharm's virtual environment option</span></figcaption></figure><h2 id="building-your-contact-enrichment-application">Building your contact enrichment application</h2>
<h3 id="installing-django-and-needed-dependencies">Installing Django and needed dependencies</h3>
<p>Next, open the terminal in PyCharm and run the following command to install Django and the requests library:</p>
<p><code>pip3 install django requests</code></p>
<h3 id="creating-a-new-django-project">Creating a new Django project</h3>
<p>After installing the required packages, navigate to the project directory you created earlier in the PyCharm terminal and run the following command to create a new Django app, replacing <code>contact_app</code> with the name of whatever you'd like to name your application:</p>
<p><code>django-admin startproject contact_app</code></p>
<p>If successful, you'll see a new folder appear named after your project name, including another folder with your project name and a file named <code>manage.py</code> within. This is your Django project.</p>
<p>In the same folder as <code>manage.py</code> within a terminal run the following command:</p>
<p><code>python3 manage.py startapp contact_app</code></p>
<p>This will generate all of the necessary files and directories for your application.</p>
<h3 id="setting-up-ngrok-for-webhooks">Setting up ngrok for webhooks</h3>
<p>As mentioned above, webhooks will play a crucial role in our contact enrichment application, as our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-work-email-lookup-endpoint">Work Email Lookup Endpoint</a> only returns results via webhook.</p>
<p>So, for development purposes, we'll use <a href="https://ngrok.com/docs/integrations/hostedhooks/webhooks/?ref=nubela.co">ngrok HostedHooks</a> for easy local webhooks that can communicate with both our API and Django locally (keyword here is locally, which is why we can't use Webhook.site).</p>
<p><a href="https://dashboard.ngrok.com/signup?ref=nubela.co">You can create your ngrok account for free here</a>, and then <a href="https://ngrok.com/download?ref=nubela.co">download the agent here</a>.</p>
<p>After that, navigate to the directory where you've extracted the ngrok executable and run the following command to authenticate your ngrok account:</p>
<pre><code>ngrok authtoken &lt;your-auth-token&gt;
</code></pre>
<p>Of course replacing the authentication token with your own from within the ngrok dashboard.</p>
<p>Then run the following command in the same directory as your ngrok executable to create a secure tunnel to your local Django server:</p>
<pre><code>ngrok http 8000
</code></pre>
<p>If successful, ngrok will display a public URL (such as <code>https://your-url.ngrok-free.app</code>) that you can use to access your local server from the internet:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/04/ngrok.png" class="kg-image" alt="Running a ngrok HostedHook" loading="lazy" width="893" height="371"><figcaption><span style="white-space: pre-wrap;">Running a ngrok HostedHook</span></figcaption></figure><p>Copy that URL. You'll need to keep ngrok running while using the contact enrichment application to receive the results back for work emails.</p>
<p>By the way, ngrok is for development uses only in this case. You'd need a different webhook process for production environments like shared team use or a SaaS.</p>
<h3 id="settingspy">Settings.py</h3>
<p>Next you'll need to open the <code>settings.py</code> file in your project directory.</p>
<p>By default, SQLite should already be set to be used as your database for Django. But you'll need to add your application name under <code>INSTALLED_APPS</code> as well as including your ngrok URL in your <code>ALLOWED_HOSTS</code>. This will be necessary everytime your ngrok address changes (when you restart it).</p>
<p>Here's an example of my <code>settings.py</code> file, with my contact application being named <code>contact_app</code>:</p>
<pre><code class="language-python">from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-key'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['your-url.ngrok-free.app', 'localhost', '127.0.0.1']

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'contact_app',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'contact_demo_app.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'contact_demo_app.wsgi.application'


# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/

STATIC_URL = 'static/'

# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
</code></pre>
<h3 id="modelspy">Models.py</h3>
<p>Next up is the <code>models.py</code> file, where you define the data models for your application.</p>
<p>Models are Python classes that represent database tables and define the structure and relationships of your application's data.</p>
<p>In the contact enrichment application, we'll define a <code>ProfileResult</code> model to store the enriched contact information retrieved from Proxycurl's API.</p>
<p>Go ahead and copy and paste the following into <code>models.py</code>:</p>
<pre><code class="language-python">from django.db import models

class ProfileResult(models.Model):
    Professional Social Network_url = models.URLField(unique=True)
    work_emails = models.TextField(blank=True, null=True)
    personal_emails = models.JSONField(blank=True, null=True, default=None)  # Updated
    contact_info = models.JSONField(blank=True, null=True, default=None)  # Updated
    status = models.CharField(max_length=36, default='pending')
    batch_id = models.CharField(max_length=36, blank=True, null=True)  # Add this line

    def __str__(self):
        return self.Professional Social Network_url

</code></pre>
<p>Then go back to your PyCharm terminal in the same directory and run the following:</p>
<pre><code class="language-python">python3 manage.py makemigrations
python3 manage.py migrate
</code></pre>
<p>That will reflect the changes for your SQLite database. The <code>ProfileResult</code> model will include fields such as:</p>
<ul>
<li><code>Professional Social Network_url</code>: A URLField to store the Professional Social Network profile URL.</li>
<li><code>work_emails</code>: A TextField to store the work email addresses associated with the profile.</li>
<li><code>personal_emails</code>: A JSONField to store the personal email addresses as a JSON object.</li>
<li><code>contact_info</code>: A JSONField to store additional contact information (e.g., phone numbers, social media profiles) as a JSON object.</li>
<li><code>status</code>: A CharField to indicate the status of the enrichment process (e.g., "pending", "completed", "failed").</li>
<li><code>batch_id</code>: A CharField to store the batch ID if the profile was processed as part of a bulk import.</li>
</ul>
<p>By defining the <code>ProfileResult</code> model, you're creating a way for the enriched contact information to be stored.</p>
<p>Django uses this model to generate the necessary database schema and provides an ORM (object-relational mapping) layer to interact with the database using Python code.</p>
<h3 id="urlspy">Urls.py</h3>
<p>The <code>urls.py</code> file is where you define the URL patterns for your application. URL patterns map specific URLs or URL patterns to corresponding view functions.</p>
<pre><code class="language-python">from django.urls import path
from contact_app import views

urlpatterns = [
    path('', views.home, name='home'),
    path('start-lookup/', views.start_lookup, name='start_lookup'),
    path('webhook/', views.webhook, name='webhook'),
    path('check-webhook-status/&lt;int:task_id&gt;/', views.check_webhook_status, name='check_webhook_status'),
    path('check_batch_status/&lt;str:batch_id&gt;/', views.check_batch_status, name='check_batch_status'),
    path('upload-csv/', views.upload_csv, name='upload_csv'),
    path('export-csv/', views.export_csv, name='export_csv'),
]
</code></pre>
<p>You'll need to make sure you update the application name to yours again.</p>
<p>In this <code>urls.py</code> file, we define:</p>
<ul>
<li><code>/</code>: The root URL pattern that maps to the main dashboard or homepage view.</li>
<li><code>/enrich/</code>: A URL pattern for initiating the enrichment process for a single Professional Social Network profile URL.</li>
<li><code>/import/</code>: A URL pattern for handling bulk imports of Professional Social Network profile URLs from a CSV file.</li>
<li><code>/webhook/</code>: A URL pattern for receiving webhook notifications from Proxycurl's API.</li>
<li><code>/export/</code>: A URL pattern for exporting the enriched contact data as a CSV file.</li>
</ul>
<p>By defining these URL patterns, you're specifying how the application should route incoming requests to the appropriate views based on the requested URLs.</p>
<h3 id="viewspy">Views.py</h3>
<p>Now time for the most important part of the application, <code>views.py</code>, which controls what our Python application does.</p>
<p>In this file, you'll need to replace the ngrok URL with your own, as well as the Proxycurl API key.</p>
<p>Additionally, you'll need to change the <code>return render</code> line to the correct folder name per your project name from <code>contact_app</code>.</p>
<p>If you didn't already create your Proxycurl account above, <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">you can create one for free here to get your key</a> and you'll start with 10 credits.</p>
<p>Here's my <code>views.py</code> file:</p>
<pre><code class="language-python">from django.shortcuts import render, redirect, get_object_or_404
from django.http import JsonResponse, HttpResponse
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_exempt
from django.core.paginator import Paginator
import json
import requests
import logging
import csv
import uuid
import io
from .models import ProfileResult
import threading

logger = logging.getLogger(__name__)

API_KEY = "Proxycurl_API_Key_Here"
HEADERS = {'Authorization': f"Bearer {API_KEY}"}
WEBHOOK_URL = 'https://your-url.ngrok-free.app/webhook/'

def get_personal_emails(Professional Social Network_profile_url):
    api_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-email'
    params = {'Professional Social Network_profile_url': Professional Social Network_profile_url, 'email_validation': 'include'}
    response = requests.get(api_endpoint, headers=HEADERS, params=params)
    return response.json() if response.status_code == 200 else None

def get_personal_numbers(Professional Social Network_profile_url):
    api_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-contact'
    params = {'Professional Social Network_profile_url': Professional Social Network_profile_url}
    response = requests.get(api_endpoint, headers=HEADERS, params=params)
    return response.json() if response.status_code == 200 else None

def lookup_work_email(Professional Social Network_profile_url):
    api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/profile/email'
    params = {'Professional Social Network_profile_url': Professional Social Network_profile_url, 'callback_url': WEBHOOK_URL}
    requests.get(api_endpoint, headers=HEADERS, params=params)

@csrf_exempt
def webhook(request):
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            Professional Social Network_profile_url = data.get('profile_url')
            work_email = data.get('email')
            status = 'success' if work_email else 'email_not_found'
            logger.info(f"Received webhook data: {data}")
            logger.info(f"Setting status to: {status}")
            profile, _ = ProfileResult.objects.update_or_create(
                Professional Social Network_url=Professional Social Network_profile_url,
                defaults={
                    'work_emails': work_email if work_email else '',
                    'status': status
                }
            )
            logger.info(f"Returning status: {status}")
            return JsonResponse({'status': status, 'task_id': profile.id, 'message': 'Email updated/created'})
        except Exception as e:
            logger.error(f"Error processing webhook: {e}")
            return JsonResponse({'status': 'error', 'message': 'Error processing webhook'}, status=500)
    else:
        logger.error("Invalid request method")
        return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=405)

@require_http_methods(["POST"])
def start_lookup(request):
    Professional Social Network_url = json.loads(request.body).get('Professional Social Network_profile_url')
    Professional Social Network_url = Professional Social Network_url.rstrip('/')
    try:
        profile = ProfileResult.objects.get(Professional Social Network_url=Professional Social Network_url)
    except ProfileResult.DoesNotExist:
        profile = ProfileResult.objects.create(Professional Social Network_url=Professional Social Network_url)

    emails = get_personal_emails(Professional Social Network_url)
    numbers = get_personal_numbers(Professional Social Network_url)
    profile.personal_emails = emails if emails else {}
    profile.contact_info = numbers if numbers else {}
    profile.save()

    lookup_work_email(Professional Social Network_url)

    return JsonResponse({'status': 'success', 'task_id': profile.id, 'message': 'Lookup initiated.'})

def check_webhook_status(request, task_id):
    profile = get_object_or_404(ProfileResult, id=task_id)
    status_value = profile.status
    print(f"Status value for task_id {task_id}: {status_value}")
    return JsonResponse({'status': status_value})

def check_batch_status(request, batch_id):
    incomplete_profiles = ProfileResult.objects.filter(batch_id=batch_id, work_emails__isnull=True)
    if incomplete_profiles.exists():
        return JsonResponse({'status': 'pending'})
    else:
        return JsonResponse({'status': 'complete'})

def home(request):
    search_query = request.GET.get('search', '')
    if search_query:
        all_profiles = ProfileResult.objects.filter(
            Professional Social Network_url__icontains=search_query
        ).order_by('-id')
    else:
        all_profiles = ProfileResult.objects.all().order_by('-id')

    paginator = Paginator(all_profiles, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    if request.method == 'POST':
        action = request.POST.get('action')
        if action == 'enrich':
            Professional Social Network_url = request.POST.get('Professional Social Network_profile_url')
            if Professional Social Network_url:
                Professional Social Network_url = Professional Social Network_url.rstrip('/')
                try:
                    profile = ProfileResult.objects.get(Professional Social Network_url=Professional Social Network_url)
                except ProfileResult.DoesNotExist:
                    profile = ProfileResult.objects.create(Professional Social Network_url=Professional Social Network_url)

                emails = get_personal_emails(Professional Social Network_url)
                numbers = get_personal_numbers(Professional Social Network_url)
                profile.personal_emails = emails if emails else {}
                profile.contact_info = numbers if numbers else {}
                profile.save()

                # Start the enrichment process in a separate thread
                enrichment_thread = threading.Thread(target=start_enrichment, args=(Professional Social Network_url,))
                enrichment_thread.start()

                return JsonResponse({'status': 'success', 'task_id': profile.id, 'message': 'Lookup initiated.'})

        elif action == 'search':
            search_query = request.POST.get('Professional Social Network_profile_url')
            return redirect(f'/?search={search_query}')

    return render(request, 'contact_app/home.html', {'page_obj': page_obj, 'search_query': search_query})

def start_enrichment(Professional Social Network_url):
    lookup_work_email(Professional Social Network_url)

def upload_csv(request):
    if request.method == 'POST' and request.FILES.get('csv_file'):
        batch_id = str(uuid.uuid4())  # Generate a unique batch ID
        csv_file = request.FILES['csv_file']
        decoded_file = csv_file.read().decode('utf-8')
        io_string = io.StringIO(decoded_file)
        reader = csv.reader(io_string)
        next(reader, None)  # Skip the header row

        profiles_to_process = []
        for row in reader:
            Professional Social Network_url = row[0].strip()
            if Professional Social Network_url:
                profile, created = ProfileResult.objects.get_or_create(
                    Professional Social Network_url=Professional Social Network_url,
                    defaults={'batch_id': batch_id}
                )
                if created or not profile.work_emails:
                    profiles_to_process.append(profile)

        for profile in profiles_to_process:
            lookup_work_email(profile.Professional Social Network_url)

        return JsonResponse({'status': 'success', 'batch_id': batch_id, 'profiles_to_process': len(profiles_to_process)})
    else:
        return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400)

def export_csv(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="profile_results.csv"'

    writer = csv.writer(response)
    writer.writerow(['Professional Social Network URL', 'Work Email', 'Personal Email', 'Invalid Emails', 'Contact Info'])

    profiles = ProfileResult.objects.all().order_by('-id')
    for profile in profiles:
        # Process personal emails
        if isinstance(profile.personal_emails, dict):
            personal_emails_list = profile.personal_emails.get('emails', [])
            personal_emails = ', '.join(personal_emails_list) if personal_emails_list else 'N/A'
            invalid_emails_list = profile.personal_emails.get('invalid_emails', [])
            invalid_emails = ', '.join(invalid_emails_list) if invalid_emails_list else 'N/A'
        elif isinstance(profile.personal_emails, list):
            personal_emails = ', '.join(profile.personal_emails) if profile.personal_emails else 'N/A'
            invalid_emails = 'N/A'
        else:
            personal_emails = 'N/A'
            invalid_emails = 'N/A'

        # Process contact info
        if isinstance(profile.contact_info, dict):
            contact_numbers_list = profile.contact_info.get('numbers', [])
            contact_numbers = ', '.join(contact_numbers_list) if contact_numbers_list else 'N/A'
        elif isinstance(profile.contact_info, list):
            contact_numbers = ', '.join(profile.contact_info) if profile.contact_info else 'N/A'
        else:
            contact_numbers = 'N/A'

        # Process work emails
        work_email = profile.work_emails if profile.work_emails else 'N/A'

        # Write the data into the CSV
        writer.writerow([
            profile.Professional Social Network_url or 'N/A',
            work_email,
            personal_emails,
            invalid_emails,
            contact_numbers,
        ])

    return response
</code></pre>
<p>In a production environment, you would want to store your API key with an environment variable.</p>
<p>This <code>views.py</code> file includes the majority of our application logic, such as:</p>
<h3 id="lookup-initiation">Lookup initiation</h3>
<p><code>start_lookup</code> processes a <code>POST</code> request to start the enrichment process for a given Professional Social Network profile URL, fetching personal emails, contact numbers, and initiating a work email lookup.</p>
<p>The results are stored in a <code>ProfileResult</code> object.</p>
<h3 id="email-and-contact-number-fetching">Email and contact number fetching</h3>
<p><code>get_personal_emails</code> and <code>get_personal_numbers</code> functions make <code>GET</code> requests to Proxycurl's API endpoints to fetch personal emails and contact numbers, respectively, using a Professional Social Network profile URL.</p>
<p>The responses are returned as <code>JSON</code>.</p>
<h3 id="work-email-lookup">Work email lookup</h3>
<p><code>lookup_work_email</code> initiates a work email lookup by making a <code>GET</code> request to our Work Email Lookup Endpoint.</p>
<p>This function includes a <code>callback_url</code> parameter, to send the results to our webhook URL.</p>
<h3 id="webhook-handling">Webhook handling</h3>
<p>The webhook view is designed to handle <code>POST</code> requests, which sends back the work email lookup results.</p>
<p>The function processes the received data, updates or creates a <code>ProfileResult</code> object with the result, and logs the operation.</p>
<h3 id="status-checks">Status checks</h3>
<p><code>check_webhook_status</code> and <code>check_batch_status provide</code> endpoints for checking the status of individual and batch enrichment tasks, respectively.</p>
<h3 id="web-interface-and-batch-processing">Web interface and batch processing</h3>
<p>The home view renders a simple web interface for interacting with the system, including initiating enrichments and searching through enriched profiles.</p>
<p><code>upload_csv</code> allows for batch uploading of Professional Social Network URLs for enrichment via CSV file.</p>
<p><code>export_csv</code> provides functionality to export enriched profile data as a CSV file.</p>
<h2 id="styling-your-django-application">Styling your Django application</h2>
<p>Django uses a templating language that allows you to embed Python-like code and variables within HTML, allowing dynamic rendering of the content.</p>
<p>In addition to the templating language, Django templates can also include JavaScript code and perform client-side operations.</p>
<p>In the contact enrichment application, there are two main templates:</p>
<ol>
<li>
<p><code>base.html</code>: This is the base template that defines the common structure and layout of the application's pages. It includes the necessary HTML boilerplate, such as the <code>&lt;!DOCTYPE html&gt;</code> declaration, <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code>, and <code>&lt;body&gt;</code> tags. The <code>base.html</code> template also contains blocks <code>({% block %})</code> that can be overridden by child templates to provide page-specific content.</p>
</li>
<li>
<p><code>home.html</code>: This is the main template for the application's homepage or dashboard. It extends the <code>base.html</code> template and provides the specific content for the homepage. The <code>home.html</code> template includes the necessary JavaScript, HTML, and Django template tags to display the enriched contact information, search functionality, pagination, and forms for initiating enrichment and importing/exporting data.</p>
</li>
</ol>
<p>The <code>home.html</code> template is responsible for rendering the main user interface of the contact enrichment application. It displays the list of enriched profiles, allows users to search and navigate through the results, and provides options to initiate enrichment for individual profiles or import profiles in bulk using a CSV file.</p>
<p>The view function associated with the homepage (<code>views.home</code>) renders the <code>home.html</code> template and passes the necessary data (such as <code>page_obj</code>, <code>search_query</code>) to populate the template with dynamic content.</p>
<h3 id="basehtml">Base.html</h3>
<p>You'll need to first create a <code>templates</code> folder within the same folder as your <code>settings.py</code> file.</p>
<p>Then within that <code>templates</code> folder, create a file named <code>base.html</code> with the following inside of it:</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Contact App&lt;/title&gt;
    &lt;!-- Bootstrap CSS --&gt;
    &lt;link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"&gt;
&lt;/head&gt;
&lt;body&gt;

    {% block content %}{% endblock %}

    &lt;!-- Bootstrap JS, Popper.js, and jQuery --&gt;
    &lt;script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"&gt;&lt;/script&gt;
    &lt;script src="https://cdn.jsdelivr.net/npm/popper.js@1.9.1/dist/umd/popper.min.js"&gt;&lt;/script&gt;
    &lt;script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>As you can see, it's pretty simple and relies on Bootstrap for styling.</p>
<p>Then within your <code>templates</code> folder, create a new folder named after your application, such as <code>contact_app</code>.</p>
<h3 id="homehtml">Home.html</h3>
<p>Next within <code>templates/contact_app</code>, we'll need to create our home file, which will control the majority of our application.</p>
<p>Go ahead and create a new file named <code>home.html</code>, and paste the following inside:</p>
<pre><code class="language-html">{% extends 'base.html' %}

{% block content %}
&lt;div class="container mt-4"&gt;
    &lt;h1 class="text-center text-gray mb-4"&gt;Contact enrichment with Proxycurl&lt;/h1&gt;
    &lt;div class="row"&gt;
        &lt;div class="col-md-12"&gt;
            &lt;table class="table table-striped table-bordered"&gt;
                &lt;thead class="thead-dark"&gt;
                    &lt;tr&gt;
                        &lt;th scope="col"&gt;Professional Social Network URL&lt;/th&gt;
                        &lt;th scope="col"&gt;Work Email&lt;/th&gt;
                        &lt;th scope="col"&gt;Valid Personal Email&lt;/th&gt;
                        &lt;th scope="col"&gt;Invalid Personal Email&lt;/th&gt;
                        &lt;th scope="col"&gt;Contact Number&lt;/th&gt;
                    &lt;/tr&gt;
                &lt;/thead&gt;
                &lt;tbody id="profile-table-body"&gt;
                    {% for profile in page_obj %}
                    &lt;tr&gt;
                        &lt;td&gt;&lt;a href="{{ profile.Professional Social Network_url }}" target="_blank"&gt;{{ profile.Professional Social Network_url }}&lt;/a&gt;&lt;/td&gt;
                        &lt;td&gt;{{ profile.work_emails|default:'None' }}&lt;/td&gt;
                        &lt;td&gt;
                            {% if profile.personal_emails and profile.personal_emails.emails %}
                                {{ profile.personal_emails.emails|join:', ' }}
                            {% else %}
                                None
                            {% endif %}
                        &lt;/td&gt;
                        &lt;td&gt;
                            {% if profile.personal_emails and profile.personal_emails.invalid_emails %}
                                {{ profile.personal_emails.invalid_emails|join:', ' }}
                            {% else %}
                                None
                            {% endif %}
                        &lt;/td&gt;
                        &lt;td&gt;
                            {% if profile.contact_info and profile.contact_info.numbers %}
                                {{ profile.contact_info.numbers|join:', ' }}
                            {% else %}
                                None
                            {% endif %}
                        &lt;/td&gt;
                    &lt;/tr&gt;
                    {% endfor %}
                &lt;/tbody&gt;
            &lt;/table&gt;
            {% if page_obj.has_other_pages %}
            &lt;nav aria-label="Page navigation example"&gt;
                &lt;ul class="pagination"&gt;
                    {% if page_obj.has_previous %}
                        &lt;li class="page-item"&gt;&lt;a class="page-link" href="?page=1{% if search_query %}&amp;search={{ search_query }}{% endif %}"&gt;First&lt;/a&gt;&lt;/li&gt;
                        &lt;li class="page-item"&gt;&lt;a class="page-link" href="?page={{ page_obj.previous_page_number }}{% if search_query %}&amp;search={{ search_query }}{% endif %}"&gt;Previous&lt;/a&gt;&lt;/li&gt;
                    {% endif %}
                    {% for num in page_obj.paginator.page_range %}
                        {% if page_obj.number == num %}
                            &lt;li class="page-item active"&gt;&lt;a class="page-link" href="?page={{ num }}{% if search_query %}&amp;search={{ search_query }}{% endif %}"&gt;{{ num }}&lt;/a&gt;&lt;/li&gt;
                        {% elif num &gt; page_obj.number|add:'-3' and num &lt; page_obj.number|add:'3' %}
                            &lt;li class="page-item"&gt;&lt;a class="page-link" href="?page={{ num }}{% if search_query %}&amp;search={{ search_query }}{% endif %}"&gt;{{ num }}&lt;/a&gt;&lt;/li&gt;
                        {% endif %}
                    {% endfor %}
                    {% if page_obj.has_next %}
                        &lt;li class="page-item"&gt;&lt;a class="page-link" href="?page={{ page_obj.next_page_number }}{% if search_query %}&amp;search={{ search_query }}{% endif %}"&gt;Next&lt;/a&gt;&lt;/li&gt;
                        &lt;li class="page-item"&gt;&lt;a class="page-link" href="?page={{ page_obj.paginator.num_pages }}{% if search_query %}&amp;search={{ search_query }}{% endif %}"&gt;Last&lt;/a&gt;&lt;/li&gt;
                    {% endif %}
                &lt;/ul&gt;
            &lt;/nav&gt;
            {% endif %}
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="my-4"&gt;
        &lt;div id="enrichment-message" class="alert alert-secondary" style="display:none;"&gt;
            &lt;p&gt;Enriching contact information... please wait.&lt;/p&gt;
        &lt;/div&gt;
        &lt;form method="post" class="form-inline" id="lookupForm"&gt;
            {% csrf_token %}
            &lt;input class="form-control mr-sm-2" name="Professional Social Network_profile_url" type="text" placeholder="Enter Professional Social Network Profile URL" value="{{ search_query }}" required&gt;
            &lt;button class="btn btn-primary mr-2 my-2 my-sm-0" type="submit" name="action" value="enrich"&gt;Enrich&lt;/button&gt;
            &lt;button class="btn btn-primary my-2 my-sm-0" type="submit" name="action" value="search"&gt;Search&lt;/button&gt;
        &lt;/form&gt;

        &lt;div class="mt-4"&gt;
            &lt;form method="post" enctype="multipart/form-data" action="{% url 'upload_csv' %}" class="form-inline" id="csvForm"&gt;
                {% csrf_token %}
                &lt;div class="input-group mr-2"&gt;
                    &lt;div class="custom-file"&gt;
                        &lt;input type="file" name="csv_file" id="csv_file" class="custom-file-input"&gt;
                        &lt;label class="custom-file-label" for="csv_file"&gt;Choose CSV file&lt;/label&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
                &lt;button type="submit" class="btn btn-primary"&gt;Enrich CSV&lt;/button&gt;
            &lt;/form&gt;
        &lt;/div&gt;
        &lt;div class="mt-4"&gt;
            &lt;a href="{% url 'export_csv' %}" class="btn btn-primary"&gt;Download contacts as CSV&lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
let webhookPollInterval;

document.getElementById('lookupForm').addEventListener('submit', function(event) {
    event.preventDefault();
    const Professional Social NetworkURLInput = document.querySelector('[name="Professional Social Network_profile_url"]');
    const Professional Social NetworkURL = Professional Social NetworkURLInput.value.trim();

    if (Professional Social NetworkURL === '') {
        alert('Please enter a Professional Social Network Profile URL.');
        return;
    }

    const action = document.querySelector('button[type="submit"][name="action"]:focus').value;
    if (action === 'enrich') {
        showEnrichmentMessage();
        fetch('/start-lookup/', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-CSRFToken': '{{ csrf_token }}',
            },
            body: JSON.stringify({ 'Professional Social Network_profile_url': Professional Social NetworkURL }),
        })
        .then(response =&gt; response.json())
        .then(data =&gt; {
            if (data.status === 'success') {
                start_work_email_lookup(Professional Social NetworkURL, data.task_id);
                pollWebhookStatus(data.task_id);
            } else {
                console.error('Error initiating lookup:', data.message);
            }
        })
        .catch(error =&gt; {
            console.error('Error initiating lookup:', error);
        });
    } else if (action === 'search') {
        window.location.href = `/?search=${encodeURIComponent(Professional Social NetworkURL)}`;
    }
});

document.getElementById('csvForm').addEventListener('submit', function(event) {
    event.preventDefault();
    const formData = new FormData(this);
    showEnrichmentMessage();

    fetch('{% url 'upload_csv' %}', {
        method: 'POST',
        body: formData,
        headers: {
            'X-CSRFToken': '{{ csrf_token }}',
        },
    })
    .then(response =&gt; response.json())
    .then(data =&gt; {
        console.log('CSV upload response:', data);
        if (data.status === 'success' &amp;&amp; data.batch_id &amp;&amp; data.check_batch_url) {
            pollBatchStatus(data.batch_id, data.check_batch_url);
        } else {
            alert('Failed to start batch processing.');
        }
    })
    .catch(error =&gt; {
        console.error('Error uploading CSV:', error);
    });
});

function showEnrichmentMessage() {
    const enrichmentMessage = document.getElementById('enrichment-message');
    enrichmentMessage.style.display = 'block';
}

function pollWebhookStatus(taskId) {
    clearInterval(webhookPollInterval); // Clear any existing interval

    webhookPollInterval = setInterval(() =&gt; {
        fetch(`/check-webhook-status/${taskId}/`)
        .then(response =&gt; response.json())
        .then(data =&gt; {
            if (data.status === 'success' || data.status === 'email_not_found') {
                clearInterval(webhookPollInterval);
                window.location.reload(); // Redirect on success or email_not_found
            } else {
                console.log(`Received status for ${taskId}:`, data);
            }
        })
        .catch(error =&gt; {
            console.error('Error checking webhook status:', error);
            clearInterval(webhookPollInterval);
        });
    }, 2000);
}

function pollBatchStatus(batchId) {
  const checkBatchUrl = `/check_batch_status/${batchId}/`;
  console.log('Starting to poll for batch status, batch ID:', batchId);
  const pollInterval = setInterval(() =&gt; {
    fetch(checkBatchUrl)
      .then(response =&gt; response.json())
      .then(data =&gt; {
        if (data.status === 'redirect') {
          // Handle the redirect
          console.log('Batch processing complete. Redirecting...');
          clearInterval(pollInterval);
          window.location.href = data.redirect_url;
        } else if (data.status === 'pending') {
          console.log('Batch processing pending...');
        } else {
          console.log('Unexpected status:', data.status);
        }
      })
      .catch(error =&gt; {
        console.error('Error during batch status polling:', error);
        clearInterval(pollInterval);
      });
  }, 5000); // Adjust polling interval as needed
}

function start_work_email_lookup(Professional Social Network_url, task_id) {
    const api_endpoint = 'https://nubela.co/proxycurl/api/Professional Social Network/profile/email';
    const params = {
        'Professional Social Network_profile_url': Professional Social Network_url,
        'callback_url': '{{ WEBHOOK_URL }}',
        'task_id': task_id
    };

    fetch(api_endpoint, {
        headers: {
            'Authorization': 'Bearer {{ API_KEY }}',
        },
        method: 'GET',
        params: params,
    })
    .then(response =&gt; {
        console.log('Lookup work email response:', response);
    })
    .catch(error =&gt; {
        console.error('Error looking up work email:', error);
    });
}
&lt;/script&gt;
{% endblock %}
</code></pre>
<h2 id="running-your-new-application">Running your new application</h2>
<p>The last step is pretty simple.</p>
<p>All you'll need to do to run your contact enrichment application is type in the following within a terminal that's in the same folder as <code>manage.py</code>:</p>
<p><code>python3 manage.py runserver</code></p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/04/python3.png" class="kg-image" alt="Running the Django web server" loading="lazy" width="617" height="199"><figcaption><span style="white-space: pre-wrap;">Running the Django web server</span></figcaption></figure><p>That'll run the Django development web server, and your application will be available in any browser through <code>127.0.0.1:8000</code>:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/04/django2.png" class="kg-image" alt="The contact enrichment application home page" loading="lazy" width="929" height="878"><figcaption><span style="white-space: pre-wrap;">The contact enrichment application home page</span></figcaption></figure><h2 id="understanding-the-contract-enrichment-application">Understanding the contract enrichment application</h2>
<h3 id="application-and-file-structure">Application and file structure</h3>
<p>Your application structure should look like this, only differing when it comes to the application/directory names:</p>
<pre><code>&lt;project_name&gt;/
│
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
├── wsgi.py
│
├── &lt;app_name&gt;/
│   │
│   ├── migrations/
│   │
│   ├── templates/
│   │   ├── base.html
│   │   └── &lt;app_name&gt;/
│   │       └── home.html
│   │
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
│
├── db.sqlite3
└── manage.py

</code></pre>
<p>The important things here being:</p>
<ul>
<li><code>&lt;app_name&gt;/</code>: This is the main Django application directory containing the core functionality of the contact enrichment application.</li>
<li><code>&lt;project_name&gt;/</code>: This is the project-level directory containing project-wide configuration files such as <code>settings.py</code> and <code>urls.py</code>.</li>
<li><code>templates/</code>: This is the project-level templates directory where the base.html template is located (as well as the <code>&lt;app_name&gt;</code> folder within <code>templates/</code> and <code>home.html</code> inside of that).</li>
<li><code>db.sqlite3</code>: This is the SQLite database file used by the application.</li>
<li><code>manage.py</code>: This is the command-line utility for managing the Django project.</li>
</ul>
<h3 id="how-the-application-works">How the application works</h3>
<p>Th <code>home.html</code> file along with our <code>views.py</code> file handle the vast majority of our application.</p>
<p>Specifically:</p>
<h4 id="1-form-submission">1) Form submission</h4>
<p>The JavaScript code on our <code>home.html</code> file adds an event listener to the form with the ID <code>lookupForm</code>.</p>
<p>When the form is submitted, it prevents the default form submission behavior and retrieves the entered Professional Social Network profile URL.</p>
<p>Based on the selected action (enrich or search), it either sends a <code>POST</code> request to initiate the enrichment process or redirects the user to the search results page.</p>
<h4 id="2-api-requests-pulling-data">2) API requests (pulling data)</h4>
<p>The Python code in the <code>views.py</code> file makes requests to Proxycurl's  API using the <code>requests</code> library.</p>
<p>The <code>get_personal_emails</code> and <code>get_personal_numbers</code> functions send <code>GET</code> requests to the Proxycurl API endpoints <code>https://nubela.co/proxycurl/api/contact-api/personal-email</code> and <code>https://nubela.co/proxycurl/api/contact-api/personal-contact</code>, respectively, to retrieve personal emails and contact information.</p>
<p>The <code>lookup_work_email</code> function sends a <code>GET</code> request to the Proxycurl API endpoint <code>https://nubela.co/proxycurl/api/Professional Social Network/profile/email</code> to initiate the work email enrichment process. This request includes the Professional Social Network profile URL and the callback URL for receiving the webhook response.</p>
<p>The server-side views handle the responses from Proxycurl's API and perform the necessary operations, such as storing the retrieved data in the <code>ProfileResult</code> model instances.</p>
<p>The JavaScript code on the <code>home.html</code> file interacts with the server-side endpoints using the fetch function to trigger the enrichment process and handle the responses accordingly.</p>
<h4 id="3-server-side-processing">3) Server-side processing</h4>
<p>The <code>views.py</code> file contains the server-side logic for handling requests and interacting with Proxycurl's API.</p>
<p>The <code>start_lookup</code> view function receives the <code>POST</code> request from the client-side JavaScript and initiates the work email enrichment process by making a <code>GET</code> request to Proxycurl's API endpoint <code>https://nubela.co/proxycurl/api/Professional Social Network/profile/email</code>.</p>
<p>The webhook view function handles the incoming webhook from Proxycurl's API, updating the corresponding <code>ProfileResult</code> model instance with the retrieved work email.</p>
<h4 id="4-storing-data">4) Storing data</h4>
<p>The <code>models.py</code> file defines the <code>ProfileResult</code> model, which represents the database table for storing enriched contact information.</p>
<p>The model defines fields such as <code>Professional Social Network_url</code>, <code>work_emails</code>, <code>personal_emails</code>, <code>contact_info</code>, <code>status</code>, and <code>batch_id</code> to store the relevant data.</p>
<p>The server-side views interact with the <code>ProfileResult</code> model to create, update, and retrieve records as needed during the enrichment process.</p>
<h4 id="5-ui-updates-data-export-batch-processing-and-webhook-handling-backend-logic">5) UI updates, data export, batch processing, and webhook handling (backend logic)</h4>
<p>The JavaScript code on the <code>home.html</code> file dynamically updates the user interface based on the responses received from the server-side and Proxycurl's API.</p>
<p>It shows enrichment messages, polls for webhook status updates, and updates the displayed data without requiring a full page reload.</p>
<p>The JavaScript code also handles functionalities like batch processing of CSV files and exporting enriched contact data as a CSV file.</p>
<h4 id="batch-processing">Batch processing</h4>
<p>For batch processing, the JavaScript code sends a <code>POST</code> request to the <code>/upload-csv/</code> endpoint on the server-side to upload a CSV file containing a list of Professional Social Network profile URLs.</p>
<p>It then polls the <code>/check_batch_status/</code> endpoint to monitor the batch processing status and redirects the user to the appropriate page once the batch is completed.</p>
<h4 id="webhook-handling">Webhook handling</h4>
<p>For webhook handling, the JavaScript code sets up polling intervals to check the status of webhook events by sending requests to the <code>/check-webhook-status/</code> endpoint.</p>
<p>It then updates the UI accordingly based on the webhook status (<code>success</code>, <code>email_not_found</code>, etc.).</p>
<p>In this example, I've used ngrok for local webhooks.</p>
<h4 id="server-side-functions">Server-side functions</h4>
<p>The server-side <code>views.py</code> file contains functions for handling CSV file uploads, batch processing, exporting enriched data as a CSV file, and managing webhooks.</p>
<p>The <code>upload_csv</code> view function handles the CSV file upload, processes the Professional Social Network profile URLs, initiates the enrichment process for each profile, and generates a unique batch ID for tracking.</p>
<p>The <code>check_batch_status</code> view function checks the status of the batch processing and returns the appropriate response (pending or complete).</p>
<p>The <code>webhook</code> view function handles the incoming webhooks from Proxycurl's API, updating the corresponding <code>ProfileResult</code> records with the retrieved work email.</p>
<h2 id="a-summarization">A summarization</h2>
<p>Overall, the application combines client-side JavaScript, server-side Python code (Django views), interaction with Proxycurl's API, data persistence using Django's ORM, batch processing, and webhook handling to provide a complete contact enrichment solution.</p>
<p>In terms of pricing per profile enriched, the application costs 3 credits per profile enrichment base rate (because of the work emails), 1 credit per phone number successfully returned, and 2 credits per personal email successfully returned (because the script uses email verification, if you wanted you could remove this and save 1 credit per result).</p>
<p>Amounting to a grand total of 6 credits per result if every variable was successfully returned, and 3 credits base rate per use (<a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">you can learn more about what a credit costs here</a>, it varies).</p>
<p>Not bad, huh?</p>
<h2 id="its-time-to-put-this-into-practice">It's time to put this into practice</h2>
<p>If you'd like, you can take our contact enrichment app right now and use it commercially. It's open source, and I don't care what you do with it.</p>
<p>Or, taking the knowledge you've learned here about our Contact API, specifically our:</p>
<ul>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-work-email-lookup-endpoint">Work Email Lookup Endpoint</a></li>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-personal-contact-number-lookup-endpoint">Personal Contact Number Lookup Endpoint</a></li>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-personal-email-lookup-endpoint">Personal Email Lookup Endpoint</a></li>
</ul>
<p>You can build your own custom application, tailored specifically to your needs and workflow. You now have access to all of the B2B data and contact information you could ever need.</p>
<p>What are you waiting for?</p>
<h2 id="create-your-proxycurl-account">Create your Proxycurl account</h2>
<p><a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">You can click here to create your Proxycurl account for free</a>. You'll start with 10 credits.</p>
<p>After that, you can opt for a pay-as-you-go or subscription plan. <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">Our pricing information is available here</a>.</p>
<p>Thanks for reading!</p>
<p><strong>P.S.</strong> Have any questions about how we can help with contact enrichment? Feel free to reach out to us at "<a href="mailto:hello@nubela.co">hello@nubela.co</a>" and we'll get back to you ASAP.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Does Proxycurl’s Third-Party LinkedIn API Scrape Contact Information From LinkedIn Profiles? ]]></title>
        <description><![CDATA[ You have questions. We have answers. This time about contact information enrichment. ]]></description>
        <link>https://nubela.co/blog/does-proxycurls-linkedin-api-pull-contact-information-from-linkedin-profiles/</link>
        <guid isPermaLink="false">609a24d1418c82000107dbe2</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Wed, 20 Mar 2024 17:15:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_393.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>No, we didn't scrape contact information from LinkedIn profiles.</p>
<p>However, we integrated our publicly scraped LinkedIn dataset, <a href="https://nubela.co/blog/linkdb-linkedin-dataset-with-people-and-company-profiles/">LinkDB</a>, with other data sources, which allowed us to provide complete enrichment, including contact information.</p>
<p>Meaning, Proxycurl could typically still provide contact information for a given LinkedIn, Twitter/X, or Facebook profile despite not scraping contact information from LinkedIn itself.</p>
<h2 id="using-proxycurl-for-contact-enrichment">Using Proxycurl for contact enrichment</h2>
<blockquote>
<p><strong>Note:</strong> Proxycurl API has been sunset. I was the founder behind Proxycurl, and I am now building NinjaPear. I am retaining the original Proxycurl details in this article because the question is specifically about how Proxycurl handled LinkedIn contact enrichment.</p>
</blockquote>
<p>For example, it could be as simple as the following cURL query to the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">Person Profile Endpoint</a>:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer Your_API_Key_Here&quot; \
    'https://nubela.co/proxycurl/api/v2/linkedin' \
    --data-urlencode 'linkedin_profile_url=https://linkedin.com/in/johnrmarty/' \
    --data-urlencode 'personal_contact_number=include' \
    --data-urlencode 'personal_email=include' \
    --data-urlencode 'use_cache=if-present' \
    --data-urlencode 'fallback_to_cache=on-error'
</code></pre>
<p>To enrich a Facebook or Twitter user, you would change this query to use <code>facebook_profile_url</code> or <code>twitter_profile_url</code> instead of <code>linkedin_profile_url</code>. You only needed one identifier.</p>
<p>The above cURL query to the Person Profile Endpoint would return you:</p>
<ul>
<li><code>Profile picture URL</code>: Direct URL to the profile picture.</li>
<li><code>Background cover image URL</code>: Direct URL to the background cover image.</li>
<li><code>First Name, last Name</code>: Name of the individual.</li>
<li><code>Follower count</code>: The number of followers the individual has.</li>
<li><code>Occupation</code>: Current job title and employer.</li>
<li><code>Headline</code>: Professional headline as listed on LinkedIn.</li>
<li><code>Summary</code>: A brief overview of the professional's background, achievements, and goals.</li>
<li><code>Country, city, state</code>: Location details.</li>
<li><code>Company Name</code>: The name of the company where the individual worked.</li>
<li><code>Company LinkedIn profile URL</code>: Direct URL to the company's LinkedIn page.</li>
<li><code>Title</code>: Job title held during the tenure at the company.</li>
<li><code>Description</code>: Description of the role and responsibilities.</li>
<li><code>Start and end dates</code>: The duration of the employment.</li>
<li><code>School Name</code>: The name of the educational institution.</li>
<li><code>School LinkedIn profile URL</code>: Direct URL to the institution's LinkedIn page.</li>
<li><code>Birth date</code>: The birthdate of the user.</li>
<li><code>Degree name and field of study</code>: Specifics of the degree earned.</li>
<li><code>Start and end dates</code>: The duration of the educational program.</li>
<li><code>Languages</code>: Languages spoken by the individual.</li>
<li><code>Certifications</code>: Any certifications that the individual has obtained.</li>
<li><code>Volunteer work</code>: Volunteer positions held, including the organization and the role.</li>
<li><code>Projects</code>: Significant projects that the individual has contributed to, including a description and URL if applicable.</li>
<li><code>Recommendations</code>: Testimonials from colleagues, clients, or employers that underscore the individual's professional capabilities.</li>
<li><code>People also viewed</code>: Other LinkedIn profiles that are frequently viewed alongside this individual's profile.</li>
<li><code>Groups</code>: LinkedIn groups that the individual is a part of, providing insight into their professional interests and affiliations.</li>
<li><code>Interests</code>: A list of interests the user has.</li>
<li><code>Personal emails</code>: A list of personal emails associated with a given identifier.</li>
<li><code>Personal numbers</code>: A list of personal numbers associated with a given identifier.</li>
</ul>
<p>If you wanted to return other social media identifiers, such as for messaging, the <code>github_profile_id</code>, <code>facebook_profile_id</code>, and <code>twitter_profile_id</code> parameters would accomplish that with the Person Profile Endpoint.</p>
<p>Please note that any of the above enrichment parameters, including <code>personal_contact_number</code> and <code>personal_email</code>, would cost 1 additional credit per successful result returned. For a full breakdown of credit usage costs, <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint">view the documentation here</a>.</p>
<h2 id="finding-work-email-addresses">Finding work email addresses</h2>
<p>To enrich a profile with a work email, you would need to use the <a href="https://nubela.co/proxycurl/docs?shell&ref=nubela.co#contact-api-work-email-lookup-endpoint">Work Email Lookup Endpoint</a>.</p>
<p>The main difference is that it functioned via webhooks and a push mechanism. For demonstration purposes, you could use <a href="https://webhook.site/?ref=nubela.co">webhook.site</a> to set up a quick and easy webhook.</p>
<p>Here's how pulling a work email would look via a simple cURL command and a webhook.site webhook:</p>
<pre><code class="language-bash">curl \
    -G \
    -H &quot;Authorization: Bearer Your_API_Key_Here&quot; \
    'https://nubela.co/proxycurl/api/linkedin/profile/email' \
    --data-urlencode 'linkedin_profile_url=https://sg.linkedin.com/in/williamhgates' \
    --data-urlencode 'callback_url=https://webhook.site/110ddbc3-d0a2-424a-b011-1cc36302a7f3'
</code></pre>
<p>Which returns the following result:</p>
<pre><code class="language-json">{&quot;email&quot;: &quot;bill@gatesfoundation.org&quot;, &quot;status&quot;: &quot;email_found&quot;, &quot;profile_url&quot;: &quot;https://www.linkedin.com/in/williamhgates&quot;}
</code></pre>
<h2 id="more-about-the-contact-api">More about the Contact API</h2>
<p>We also offered the respective <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api">Contact API</a> endpoints, which may have been useful, particularly if you had no interest in general enrichment and only needed contact information:</p>
<ul>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-personal-email-lookup-endpoint">Personal Email Lookup Endpoint</a></li>
<li><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#contact-api-personal-contact-number-lookup-endpoint">Personal Contact Number Lookup Endpoint</a></li>
</ul>
<h2 id="create-your-account">Create your account</h2>
<p>Between the Person Profile Endpoint, including the additional contact enrichment parameters available for it, as well as the Work Email Lookup Endpoint, Personal Email Lookup Endpoint, and Personal Contact Number Lookup Endpoint, there were several options for contact information enrichment.</p>
<p>If you're reading this today, the important context is simple: Proxycurl is no longer the active product. I now run <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, where the broader focus is B2B intelligence built from public web and first-party data, not scraping LinkedIn contact information.</p>
<p>If you want to explore what I am building now, you can start with NinjaPear's <a href="https://nubela.co/docs/?ref=nubela.co">Employee API</a> and the rest of the platform from there.</p>
<p><strong>P.S.</strong> For historical context on Proxycurl billing and pricing, the old pricing references in this article were tied to Proxycurl's documentation and product structure at the time this post was originally written.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ I’d Like to Cancel My Plan, Do I Have to Incur Any Cancellation Fee? ]]></title>
        <description><![CDATA[ Short answer, yes.


Long answer,



It depends on the plan you are on


There are three types of plans Proxycurl offers:


 1. Annual Plan, billed monthly
 2. Annual Plan, billed annually
 3. Pay-as-you-go, ala-carte credit purchase


The 2nd and 3rd plan types won&#39;t be the content of discussion ]]></description>
        <link>https://nubela.co/blog/subscription-plan-cancellation/</link>
        <guid isPermaLink="false">65f2bbadada96c0001a0547d</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Tue, 19 Mar 2024 13:30:27 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Short answer, yes.</p>
<p>Long answer,</p>
<h2 id="it-depends-on-the-plan-you-are-on">It depends on the plan you are on</h2>
<p>There are <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">three types of plans Proxycurl offers</a>:</p>
<ol>
<li>Annual Plan, billed monthly</li>
<li>Annual Plan, billed annually</li>
<li>Pay-as-you-go, ala-carte credit purchase</li>
</ol>
<p>The 2nd and 3rd plan types won't be the content of discussion here because you would've already made payment before you get on the plans.</p>
<p>For the 1st plan - the <em>Annual Plan, billed monthly</em> - yes there'll be cancellation fees, <strong>amounting to the remaining month(s) of the plan left unpaid</strong>.</p>
<p>This plan involves a 12-month contract, with a monthly billing frequency. Therefore if a customer would like to cancel their subscription plan i.e. rescind the contract, this'll be the cancellation fee involved.</p>
<h2 id="more-details-on-the-annual-billed-monthly-plans">More details on the <em>Annual, billed monthly Plans</em></h2>
<p>When you're subscribing to a new <em>Annual Plan that is billed monthly</em> in your dashboard, you'll see this option at the bottom that states the annual commitment required for these Plans.</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/SCR-20240314-pfjz.png" class="kg-image" alt="The checkbox needed to be ticked off to proceed with the next step. " loading="lazy" width="1257" height="720"><figcaption><span style="white-space: pre-wrap;">Screenshot of what you'll see in your dashboard</span></figcaption></figure><p>The checkbox needed to be ticked off to proceed with the next step.</p>
<h2 id="need-to-talk-to-someone">Need to talk to someone?</h2>
<p>We presume about our plans and products? Email us at <a href="mailto:hello@nubela.co">hello@nubela.co</a>. We'll respond to you very quickly.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ LinkDB: A Comprehensive Professional Social Network Dataset of Over 485 Million People and Company Profiles ]]></title>
        <description><![CDATA[ Skip the web scraping team, proxies, Professional Social Network accounts, and beyond. Just grab our B2B dataset instead. ]]></description>
        <link>https://nubela.co/blog/linkdb-linkedin-dataset-with-people-and-company-profiles/</link>
        <guid isPermaLink="false">65e25fa4ada96c0001a04f77</guid>
        <category><![CDATA[ linkdb ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Mon, 18 Mar 2024 11:43:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_391.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<blockquote>
<p><strong>Update from Nubela:</strong> Proxycurl, and by extension LinkDB, have been sunset. I am the founder behind Proxycurl, and I am now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, our newer B2B intelligence platform. I am leaving this article up because the underlying explanation of what LinkDB was, how the dataset was structured, and how to work with large LinkedIn-style datasets is still useful. Where relevant, I have updated this post for accuracy.</p>
</blockquote>
<p>At the time of posting this article, <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkDB</a> has 485,373,254 public LinkedIn profiles, to be specific. By the time you're reading this, it's even more.</p>
<p>LinkedIn is by far the world's largest professional social media site, and by virtue, the world's largest source of B2B data. If you can tap into its B2B dataset, there are many different interesting things you can do with it.</p>
<p>Anywhere from <a href="https://nubela.co/blog/the-vc-playbook-proven-methods-for-identifying-and-securing-promising-startups-first/">finding prime investment opportunities</a>, to training AI models, or <a href="https://nubela.co/blog/the-blueprint-to-building-a-successful-sales-prospecting-application/">building the next best SaaS application</a>, and beyond.</p>
<p><img alt="common use cases of linkdb" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/Artboard_2.png" /></p>
<p>LinkDB acts as a data foundation for all kinds of B2B applications.</p>
<p>But the problem is LinkedIn doesn't make it very easy to extract data from their platform, even if you're willing to pay for it. They want to gatekeep it and use it to power their own tools such as LinkedIn Recruiter and Sales Navigator instead.</p>
<p>Thus, a need for things like <a href="https://nubela.co/blog/reviewing-top-linkedin-scraping-api-services/">LinkedIn scrapers</a>, but scraping LinkedIn is never a hassle-free experience. You'll constantly be fixing things and it requires a dedicated web scraping team to scale. This often doesn't make sense for many businesses.</p>
<p>Which is exactly why we created LinkDB. It makes acquiring B2B data easy so that you can focus on implementing the data, rather than acquiring it.</p>
<h1 id="download-a-linkdb-sample">Download a LinkDB sample</h1>
<p>We're big believers in not just telling, but showing.</p>
<p>So, if you're interested in downloading either a company or profile LinkDB sample, there are 10,000 real profiles in either export, you can do so below:</p>
<p>Enter your first name:  </p>
<p>Enter your email:  </p>
<p>HP</p>
<p>Just check your email shortly after submitting the form. This will help you follow along and get the most out of this article.</p>
<p>Continuing on:</p>
<h2 id="what-kind-of-data-does-linkdb-contain">What kind of data does LinkDB contain?</h2>
<p>LinkDB contains data on both people and companies.</p>
<h3 id="linkdbs-people-dataset">LinkDB's people dataset</h3>
<p>You can expect to receive the following data points as part of our people dataset:</p>
<ul>
<li>Articles related to the profiles, featuring titles, publication dates, and summaries.</li>
<li>Activities such as posts, comments, and engagements tied to profiles.</li>
<li>Certifications individuals hold, listing names, issuing bodies, and acquisition dates.</li>
<li>Courses completed, noting course titles, institutions, and completion dates.</li>
<li>Educational background with degrees, institutions, and years attended.</li>
<li>Professional experience outlining job titles, employers, tenure, and roles.</li>
<li>Group memberships detailing group names and individual roles.</li>
<li>Honors and Awards received, with names, issuers, and dates.</li>
<li>Language proficiencies listing languages and proficiency levels.</li>
<li>Organization affiliations beyond employment, including names and roles.</li>
<li>Projects detailing titles, descriptions, durations, and roles.</li>
<li>Publications authored, including titles, dates, and co-authors.</li>
<li>Recommendations given or received, with texts and relationship contexts.</li>
<li>Similar profile names for disambiguation.</li>
<li>Test scores listing test names, scores, and dates.</li>
<li>Volunteering experiences including roles, organizations, and durations.</li>
<li>Core profile information such as names, titles, and summaries.</li>
</ul>
<p>The core profile schema consists of:</p>
<ul>
<li><code>id</code>: Unique identifier for each profile.</li>
<li><code>profile_picture_url</code>: Link to the profile's image.</li>
<li><code>city</code>: Base city of the profile owner.</li>
<li><code>country</code>: Country code and full name, reflecting the profile's national affiliation.</li>
<li><code>first_name</code>: The first name name of the profile owner.</li>
<li><code>last_name</code>: The last name name of the profile owner.</li>
<li><code>headline</code>: The headline of the profile.</li>
<li><code>summary</code>: The summary of the profile.</li>
<li><code>state</code>: State or region for more precise geographical detail.</li>
<li><code>background_cover_image_url</code>: Link to the profile's background image.</li>
<li><code>birth_date</code>: Profile owner's birth date.</li>
<li><code>connections</code>: Network size.</li>
<li><code>follower_count</code>: The number of followers of the account.</li>
<li><code>occupation</code>: Current job title.</li>
<li><code>crawler_name</code>: Source of data collection.</li>
</ul>
<h3 id="linkdbs-company-dataset">LinkDB's company dataset</h3>
<p>For companies, the core schema consists of:</p>
<ul>
<li><code>html_url</code>: A URL to the company's profile page.</li>
<li><code>name</code>: The name of the company.</li>
<li><code>description</code>: A detailed description of what the company is about.</li>
<li><code>tagline</code>: Not provided, but would be a succinct statement representing the company's mission or ethos.</li>
<li><code>website</code>: The URL to the company's website.</li>
<li><code>industry</code>: The sector in which the company operates.</li>
<li><code>founded_year</code>: The year the company was established.</li>
<li><code>profile_pic_url</code>: A URL to the company's logo or profile picture.</li>
<li><code>background_cover_image_url</code>: A URL to a background or cover image for the company's profile.</li>
<li><code>search_id</code>: A unique search identifier, possibly related to the database or API query.</li>
<li><code>company_type</code>: Indicates the legal structure of the company.</li>
<li><code>company_size_on_linkedin</code>: The number of employees listed on LinkedIn.</li>
<li><code>company_size_min</code>: The minimum number of employees in the company.</li>
<li><code>company_size_max</code>: The maximum number of employees in the company.</li>
<li><code>follower_count</code>: The number of followers the company has.</li>
<li><code>linkedin_internal_id</code>: A unique identifier within LinkedIn.</li>
<li><code>email_pattern_probed</code>: The pattern used for company email addresses.</li>
<li><code>domain</code>: The internet domain name for the company.</li>
</ul>
<h1 id="what-format-does-linkdb-come-in">What format does LinkDB come in?</h1>
<p>When dealing with large datasets, especially those containing complex nested structures like those found in LinkedIn profiles, the choice of file format becomes rather important.</p>
<p>Traditional formats like CSV or JSON might suffice for smaller datasets, but they quickly become inefficient for larger ones.</p>
<p>This is where <a href="https://parquet.apache.org/?ref=nubela.co">Apache Parquet</a> comes into play.</p>
<h2 id="introducing-parquet">Introducing Parquet</h2>
<p>Parquet is a columnar storage format that's optimized for big data processing. It differs from row-based storage formats by storing data column-wise instead of sequentially by row.</p>
<p>This columnar storage allows for efficient compression and encoding schemes that are tailored to the data type of each column, significantly improving query performance. This is especially beneficial for analytics workloads, which typically only access a subset of columns. One of the key features of Parquet is predicate pushdown, which enables query engines to skip entire chunks of data based on filter conditions, thereby speeding up query execution.</p>
<p>Additionally, Parquet files contain embedded schema information, making them self-describing and capable of evolving schemas without breaking compatibility.</p>
<p>This flexibility is complemented by cross-platform compatibility, as Parquet files can be read and written by various big data processing frameworks, such as Apache Spark, Apache Hive, and Apache Impala, ensuring high interoperability.</p>
<h2 id="why-use-parquet-for-linkdb">Why use Parquet for LinkDB?</h2>
<p>Given LinkDB's extensive dataset consists of over 485 million profiles, choosing the right file format is crucial for efficient data storage, processing, and analysis.</p>
<p>Parquet's columnar storage and compression capabilities make it an ideal choice for handling large volumes of structured data, such as the diverse range of attributes found in LinkedIn profiles. Also, Parquet's support for schema evolution simplifies data management and facilitates seamless integration with evolving data models.</p>
<p>The long story short is by storing LinkDB's data in the Parquet format, we ensure optimal performance and scalability for various use cases, from basic profile searches to complex analytics and machine learning tasks.</p>
<h2 id="how-to-use-linkdb">How to use LinkDB</h2>
<p>Personally, I'm experienced with Python and prefer it, so we'll be using it in the following examples of interpreting this dataset, but of course, you could use your language of choice. Python does work pretty well for data analytics, though.</p>
<p>By using Python, <a href="https://pandas.pydata.org/?ref=nubela.co">pandas</a>, and <a href="https://pypi.org/project/fastparquet/?ref=nubela.co">fastparquet</a>, we'll have an intuitive framework for performing operations similar to those in SQL, but with more flexibility and efficiency, particularly when dealing with Parquet files.</p>
<p>That said, the first step in doing anything with this dataset is installing a Python integrated development environment, IDE, as well as the libraries required to interpret it.</p>
<h2 id="installing-your-tools">Installing your tools</h2>
<h3 id="pycharm-your-python-ide">PyCharm: your Python IDE</h3>
<p>While any integrated development environment, IDE, will work, PyCharm is my Python IDE of choice. It provides coding assistance, debugging, and many other features to make Python development easier and more efficient.</p>
<p><a href="https://www.jetbrains.com/pycharm/?ref=nubela.co">You can download it here for free</a> (with the community edition).</p>
<h3 id="create-a-new-project">Create a new project</h3>
<p>After installing PyCharm, the next step is to create a new project and set up a virtual environment. This environment is crucial for managing project-specific dependencies without affecting other Python projects or the system-wide Python installation.</p>
<p>So open up PyCharm and select "File" then "New Project". Specify the project location and give your project a name.</p>
<p>In the new project window, ensure that the "Virtualenv" option is selected under the interpreter section. PyCharm will automatically suggest a location for the new virtual environment:</p>
<p><img alt="Creating a new project in PyCharm" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/py.png" /></p>
<p>Creating a new project in PyCharm</p>
<h3 id="install-pandas-and-fastparquet">Install pandas and fastparquet</h3>
<p>With your project set up, you're now ready to install pandas and fastparquet. These libraries will be installed within the virtual environment you've created for your project.</p>
<p>You'll find the "Terminal" tab at the bottom of the PyCharm window. Click it to open the command line within PyCharm.</p>
<p>Then type the following command:</p>
<pre><code class="language-bash">pip3 install pandas
</code></pre>
<p>And after installing pandas, you can install fastparquet by typing the following command:</p>
<pre><code class="language-bash">pip3 install fastparquet
</code></pre>
<p>(<strong>Note:</strong> fastparquet might require additional dependencies like numpy and thrift. The <code>pip</code> install command should handle these automatically.)</p>
<p><img alt="Installing fastparquet within PyCharm" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/terminalpy.png" /></p>
<p>Installing fastparquet within PyCharm</p>
<p>Also, consider installing <code>python-snappy</code>. This is optional but can be beneficial for working with compressed Parquet files.</p>
<p>You can install it with:</p>
<pre><code class="language-bash">pip3 install python-snappy
</code></pre>
<h2 id="verifying-the-installation">Verifying the installation</h2>
<p>After installation, you can verify that pandas and fastparquet are correctly installed by importing them in a PyCharm Python file:</p>
<pre><code class="language-python">import pandas as pd
import fastparquet
</code></pre>
<p>If no errors appear, congratulations! You've successfully set up your environment to work with pandas and fastparquet in PyCharm.</p>
<p>Now let me show you a few examples of using and interpreting LinkDB data:</p>
<h2 id="finding-and-displaying-linkdb-data">Finding and displaying LinkDB data</h2>
<p>Consider the common task of executing a basic profile search, which in the SQL world, would involve a simple <code>SELECT</code> statement to fetch essential information.</p>
<p>In the pandas realm, this translates to reading the Parquet file into a DataFrame and selecting the required columns with just a few lines of code.</p>
<p>For example, using some simple Python and pandas, here's how you could load up a given Parquet file and return the list of names enclosed within:</p>
<pre><code class="language-python">import pandas as pd

# Load the Parquet file
df = pd.read_parquet('path_to_your_parquet_file.parquet')

# Select the first_name and last_name columns and display the first 10 rows
print(df[['first_name', 'last_name']].head(10))
</code></pre>
<p>That would return a result such as follows:</p>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/pandas.png" /></p>
<p>(<strong>Note:</strong> You can download this sample file <a href="https://nubela.co/blog/linkdb-linkedin-dataset-with-people-and-company-profiles/#download-a-linkdb-sample">above</a>.)</p>
<p>We could also pull and display anything else contained in the schema above.</p>
<p>For example, if we edit the above script accordingly:</p>
<pre><code class="language-python">import pandas as pd

# Load the Parquet file
df = pd.read_parquet('filtered-profile-0.parquet')

# Adjust pandas display settings
pd.set_option('display.max_columns', None)  # Ensure all columns are shown
pd.set_option('display.width', None)  # Automatically adjust display width

# Select the specified columns and display the first 10 rows
columns_to_select = [
    'id',
    'profile_pic_url',
    'first_name',
    'last_name',
    'city',
    'country',
    'headline',
    'summary',
    'state',
    'background_cover_image_url',
    'birth_date',
    'connections',
    'follower_count',
    'occupation',
    'crawler_name'
]

print(df[columns_to_select].head(10))
</code></pre>
<p>You'll see the following result returned instead:</p>
<p><img alt="The new result with more information returned in PyCharm" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/moreinfo.png" /></p>
<p>The new result with more information returned in PyCharm</p>
<p>The list of course keeps going, returning any of the information we have available for the requested available data points contained within the dataset.</p>
<p>Now let's say you work for a recruiting firm, or run a HR tech SaaS and have a specific need to query LinkDB, searching for a specific individual that fits a role.</p>
<h2 id="searching-for-software-engineers-in-san-francisco">Searching for software engineers in San Francisco</h2>
<p>Using some Python, we can specifically target and search for variables contained in <code>occupation</code> and <code>city</code>, here's how:</p>
<pre><code class="language-python">import pandas as pd

# Load the Parquet file
df = pd.read_parquet('filtered-profile-0.parquet')

# Adjust pandas display settings
pd.set_option('display.max_columns', None)  # Ensure all columns are shown
pd.set_option('display.width', None)  # Automatically adjust display width

# Filter for software engineers in cities containing &quot;San Francisco&quot;
software_engineers_sf = df[df['occupation'].str.contains('Software Engineer', case=False) &amp;
                           df['city'].str.contains('San Francisco', case=False)]

# Select and display the specified columns
columns_to_select = [
    'first_name',
    'last_name',
    'occupation'
]

print(software_engineers_sf[columns_to_select])
</code></pre>
<p>It returns us a bunch of results of software engineers contained in San Francisco:</p>
<p><img alt="Results returned in PyCharm" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/03/pycharmresults.png" /></p>
<p>Results returned in PyCharm</p>
<p>Let's move onto something a little more specific:</p>
<h2 id="searching-for-apple-employees">Searching for Apple employees</h2>
<p>LinkDB contains work experience, which is contained in <code>filtered-profile_experience-0.parquet</code>. Using this work experience along with the vanity IDs of any given profile, we can match these experiences to the profiles contained within <code>filtered-profile-0.parquet</code>.</p>
<p>And by doing so, we can search for interesting profiles that meet specific criteria, like working for a company.</p>
<p>That said, using some Python, here's how we could look for Apple employees:</p>
<pre><code class="language-python">import pandas as pd

# Load the profiles DataFrame from the Parquet file
profiles_df = pd.read_parquet('filtered-profile-0.parquet')
# Load the experience DataFrame from the Parquet file
experience_df = pd.read_parquet('filtered-profile_experience-0.parquet')

# Ensure both 'id' columns are strings to match correctly
profiles_df['id'] = profiles_df['id'].astype(str)
experience_df['profile_id'] = experience_df['profile_id'].astype(str)

# Check columns in both DataFrames before merging
print(&quot;Profiles DataFrame Columns:&quot;, profiles_df.columns)
print(&quot;Experience DataFrame Columns:&quot;, experience_df.columns)

# Perform the merge
merged_df = pd.merge(profiles_df, experience_df, how='inner', left_on='id', right_on='profile_id')

# Filter for Apple-related employees, excluding &quot;Applebee's&quot;
apple_related_employees = merged_df[
    merged_df['company'].str.contains('Apple', case=False, na=False) &amp;
    ~merged_df['company'].str.contains(&quot;Applebee's&quot;, case=False, na=False)
]

# Select columns to include from both original DataFrames
columns_to_include = [
    'id', 'first_name', 'last_name', 'city', 'country',
    'headline', 'state', 'occupation',  # From profiles_df
    'starts_at', 'ends_at', 'company', 'company_profile_url',
    'title', 'location', 'description',  # From experience_df
    'profile_id', 'company_urn', 'logo_url'
]

# Ensure columns exist in merged_df before selection
final_columns = [col for col in columns_to_include if col in merged_df.columns]
final_results = apple_related_employees[final_columns]

# Display count and preview
print(f&quot;Count: {len(final_results)}&quot;)
print(final_results.head())

# Export to CSV
final_results.to_csv('apple_related_employees_detailed.csv', index=False)
print(&quot;Export completed: 'apple_related_employees_detailed.csv'&quot;)
</code></pre>
<p>In the above example, the script searches for anyone that contains "Apple" in their work history, excluding the common American business named "Applebee's". If you wanted, you could also require an exact match.</p>
<p>You would just slightly alter the above script, such as following:</p>
<pre><code class="language-python"># Filter specifically for employees of Apple Inc., ensuring exact match
apple_employees = merged_df[
    (merged_df['company'] == 'Apple') | (merged_df['company'] == 'Apple Inc.')
]
</code></pre>
<p>After the script stops searching for Apple employees, it then prints the count, displaying a sample of data, and exports it to a <code>.csv</code> file named <code>apple_related_employees_detailed.csv</code> contained within the same directory of the script.</p>
<p>If you wanted, you could export this to a Parquet file by editing the end:</p>
<pre><code class="language-python"># Export to Parquet
final_results.to_parquet('apple_employees_detailed.parquet', index=False)
print(&quot;Export completed: 'apple_employees_detailed.parquet'&quot;)
</code></pre>
<h1 id="building-a-web-application-with-linkdb">Building a web application with LinkDB</h1>
<p>Now that you know a bit more about the logic behind searching for profiles, we can create a basic web application for searching for and exporting interesting data.</p>
<p>To do so, we'll use <a href="https://flask.palletsprojects.com/en/3.0.x/?ref=nubela.co">Flask</a>, which can be installed by running <code>pip3 install flask</code> in PyCharm's command line.</p>
<p>Then create a new folder for your project to go into, and we'll need to create a few files.</p>
<p>First, you'll create <code>app.py</code>, which needs the following inside:</p>
<pre><code class="language-python">from flask import Flask, request, render_template, make_response
import pandas as pd

app = Flask(__name__)

# Load the DataFrames (consider doing this on demand or caching if they're large)
profiles_df = pd.read_parquet('filtered-profile-0.parquet')
experience_df = pd.read_parquet('filtered-profile_experience-0.parquet')
merged_df = pd.merge(profiles_df, experience_df, how='inner', left_on='id', right_on='profile_id')


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        company_name = request.form['company_name']
        filtered_df = merged_df[merged_df['company'].str.contains(company_name, case=False, na=False)]

        # Generate HTML table and strip leading/trailing whitespace
        html_table = filtered_df.to_html(classes='data', escape=False).strip()

        return render_template('results.html', tables=[html_table], titles=filtered_df.columns.values, company_name=company_name)
    return render_template('index.html')


@app.route('/export/&lt;company_name&gt;', methods=['GET'])
def export(company_name):
    filtered_df = merged_df[merged_df['company'].str.contains(company_name, case=False, na=False)]

    # Clean each string column in the DataFrame before exporting
    for column in filtered_df.columns:
        if filtered_df[column].dtype == 'object':
            filtered_df[column] = filtered_df[column].apply(
                lambda x: x.replace('\n', '').replace(&quot;'&quot;, '') if isinstance(x, str) else x)

    csv = filtered_df.to_csv(index=False)
    response = make_response(csv)
    response.headers['Content-Disposition'] = f'attachment; filename={company_name}_employees.csv'
    response.headers['Content-Type'] = 'text/csv'
    return response


if __name__ == '__main__':
    app.run(debug=True)
</code></pre>
<p>Then within that same folder, create another folder named <code>templates</code> and create two new <code>.html</code> files within it, the first being named <code>index.html</code>:</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Company Search&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h2&gt;Search for Company Employees&lt;/h2&gt;
    &lt;form method=&quot;post&quot;&gt;
        &lt;input type=&quot;text&quot; name=&quot;company_name&quot; placeholder=&quot;Enter Company Name&quot;&gt;
        &lt;input type=&quot;submit&quot; value=&quot;Search&quot;&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>And the second being named <code>results.html</code>:</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Search Results&lt;/title&gt;
    &lt;style&gt;
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        tr:nth-child(even){background-color: #f9f9f9;}
        .button {
            display: inline-block;
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            text-align: center;
            text-decoration: none;
            color: #fff;
            background-color: #007bff;
            border: none;
            border-radius: 5px;
        }
        .button:hover {
            background-color: #0056b3;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h2&gt;Search Results for &quot;{{ company_name }}&quot;&lt;/h2&gt;
    {% if tables %}
        &lt;div&gt;{{ tables|safe }}&lt;/div&gt;
        &lt;!-- Convert link to button --&gt;
        &lt;a href=&quot;{{ url_for('export', company_name=company_name) }}&quot; class=&quot;button&quot;&gt;Export to CSV&lt;/a&gt;
    {% else %}
        &lt;p&gt;No results found.&lt;/p&gt;
    {% endif %}
    &lt;br&gt;
    &lt;br&gt;
    &lt;!-- Convert link to button for consistency, if desired --&gt;
    &lt;a href=&quot;/&quot; class=&quot;button&quot;&gt;New Search&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Finally, move your two Parquet files <code>filtered-profile-0.parquet</code> and <code>filtered-profile_experience-0.parquet</code> into the same folder as <code>app.py</code> is contained in, as we'll use these as our database, and then right click <code>app.py</code> within PyCharm and click "Run".</p>
<p>Then visit <code>http://127.0.0.1:5000/</code> within your browser:</p>
<p><img alt="GIF demonstrating the use of a Flask Python web application" src="https://res.cloudinary.com/dpuhdckou/image/upload/v1715203953/webpython_1_lfnxy4.gif" /></p>
<h2 id="one-final-note">One final note</h2>
<p>If you landed on this post looking for a current product rather than historical context, LinkDB is no longer the thing to buy. This post explains what LinkDB was and how to work with a large LinkedIn-derived dataset, but Proxycurl and LinkDB themselves have been sunset.</p>
<p>What I am building now is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which takes a different path. Instead of continuing down the old LinkedIn dataset route, NinjaPear is the newer B2B intelligence platform we are focused on today.</p>
<p>I am keeping this article live because the technical bits, Parquet discussion, schema examples, and sample Python workflows are still useful if you're evaluating this category or working with historical exports.</p>
<p>If your actual need today is fresh company or people intelligence from public web sources, start with NinjaPear instead.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ LinkedIn Messages API: What Actually Works in 2026 ]]></title>
        <description><![CDATA[ The idea of being able to programmatically message anyone on Professional Social Network, the world&#39;s largest social networking site, is quite appealing. But is it possible? ]]></description>
        <link>https://nubela.co/blog/automate-linkedin-messaging-without-api/</link>
        <guid isPermaLink="false">65c6a66186ccd600018f402c</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Tue, 05 Mar 2024 10:37:38 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_390-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>The idea of being able to programmatically send LinkedIn messages at scale is appealing.</p>
<p>Unfortunately, if you're looking for a practical LinkedIn Messages API for sales, recruiting, or outbound, the short answer is no. The official <a href="https://learn.microsoft.com/en-us/linkedin/shared/integrations/communications/messages?ref=nubela.co">LinkedIn Messages API</a> exists, but it sits behind the <a href="https://learn.microsoft.com/en-us/linkedin/compliance/compliance-api/overview?ref=nubela.co">Compliance API</a>, and access is heavily restricted.</p>
<p>Here's how LinkedIn describes the requirements themselves:</p>
<blockquote>
<p>The Compliance Partner Program is a private and paid program where LinkedIn provides access only to companies with use cases that meet our requirements. The requirement being that the organization or its customers should be FINRA / SEC registered. The primary use case should be archiving and monitoring regulated member's (from financial institutions) posts and public correspondence as required for the organization to be compliant with FINRA &amp; SEC regulations.</p>
</blockquote>
<p>So if you're not FINRA / SEC registered, don't bother. The main use case also needs to be archiving and monitoring for compliance, not sales or marketing.</p>
<p>Furthermore, the LinkedIn Messages API has these additional ground rules:</p>
<ul>
<li>Your messages must be tied to specific user actions.</li>
<li>Your users must opt-in for messaging.</li>
<li>You can't give incentives for opting in to receive messages from you.</li>
<li>Your messages must be pure text. No styling of any kind.</li>
</ul>
<p>That rules out almost everyone. If you do happen to be one of the ~3 companies on earth this API was made for, I'm half joking, you can <a href="https://forms.office.com/pages/responsepage.aspx?id=v4j5cvGGr0GRqy180BHbR8-45gWDXSBCiG6crIdp2BFUMk5FSVdIVlZRMzM0WVMxTUlHSlM3VFBBSy4u&ref=nubela.co">apply for approval to the Compliance Partner Program here</a>.</p>
<p>On the other hand, if you're in the majority that don't qualify, keep reading.</p>
<h2 id="alternative-solutions-to-the-linkedin-messages-api">Alternative solutions to the LinkedIn Messages API</h2>
<p>While there are quite a few <a href="https://nubela.co/blog/guide-to-linkedin-automation/">LinkedIn automation tools</a> designed to unofficially automate various tasks, there are three main LinkedIn automation tools designed primarily for messaging.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Best for</th>
<th style="text-align: right;">Starting price</th>
<th>Messaging automation</th>
<th>Connection automation</th>
<th>Delivery model</th>
<th>My take</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dripify</td>
<td>Multi-step campaigns</td>
<td style="text-align: right;">$59/mo</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Web app</td>
<td>4.0/5</td>
</tr>
<tr>
<td>Octopus CRM</td>
<td>Budget/simple workflows</td>
<td style="text-align: right;">$9.99/mo</td>
<td>⭐⭐⭐☆☆</td>
<td>⭐⭐⭐⭐☆</td>
<td>Chrome extension</td>
<td>3.8/5</td>
</tr>
<tr>
<td>Expandi</td>
<td>Power users</td>
<td style="text-align: right;">$99/mo</td>
<td>⭐⭐⭐⭐☆</td>
<td>⭐⭐⭐⭐⭐</td>
<td>Web app</td>
<td>4.2/5</td>
</tr>
</tbody>
</table>
<h2 id="1-dripify">1) Dripify</h2>
<p><img alt="Dripify CRM's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/dripify-no-uk.png" /></p>
<p>Dripify CRM's homepage</p>
<p>As the name suggests, <a href="https://dripify.io/?ref=nubela.co">Dripify</a> focuses on drip campaigns, which is just another way of saying multi-step outreach with if/then logic.</p>
<p>Sometimes days out. Sometimes weeks. Different branches depending on what the prospect does or doesn't do.</p>
<p>And it all runs through a simple web app:</p>
<p><img alt="What a Dripify campaign looks like (Source: Dripify)" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/dripify-campaign.png" /></p>
<p>What a Dripify campaign looks like (Source: Dripify)</p>
<p>It works well overall for LinkedIn messages automation and integrates with a bunch of other apps.</p>
<p>On LinkedIn, <a href="https://www.linkedin.com/help/linkedin/answer/a564261/linkedin-messaging-overview?ref=nubela.co">you can only message your 1st-degree connections</a>, so you need to connect first before messaging.</p>
<p>Dripify includes connection requests by email, which helps get around what is normally ~100 connections per week. It also caps sending at 100 messages per day for a free LinkedIn account or 150 per day for a paid account.</p>
<p>Dripify's plans range from $59 to $99 per user per month.</p>
<h2 id="2-octopus-crm">2) Octopus CRM</h2>
<p><img alt="Octopus CRM's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/octo-no-uk.png" /></p>
<p>Octopus CRM's homepage</p>
<p>You could think of <a href="https://octopuscrm.io/?ref=nubela.co">Octopus CRM</a> as Dripify's simpler cousin. I'm honestly not sure if they're owned by the same people, but the overlap is obvious.</p>
<p>Octopus CRM does most of what Dripify does, in a simpler package, for less money. You do get less functionality. That's the trade.</p>
<p>Instead of a web app, it runs as a Chrome extension:</p>
<p><img alt="Octopus CRM's LinkedIn messaging automation dashboard" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/octo-msg.png" /></p>
<p>Octopus CRM's LinkedIn messaging automation dashboard</p>
<p>It supports connection requests by email, plus the same basic message throughput: 100 messages per day on a free LinkedIn account, or 150 on a paid account.</p>
<p>Pricing ranges from $9.99 per month to $39.99 per month.</p>
<p>Overall, I think it's a good balance of simplicity and functionality for automating LinkedIn messages if you don't need a huge amount of branching logic.</p>
<h2 id="3-expandi">3) Expandi</h2>
<p><img alt="Expandi's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/expandi-min.png" /></p>
<p>Expandi's homepage</p>
<p>Everything with <a href="https://expandi.io/?ref=nubela.co">Expandi</a> works pretty cleanly. You don't have to click around much to find what you need, but it still has plenty of depth.</p>
<p>It works a lot like Dripify and runs as a web app, no browser extension required:</p>
<p><img alt="Expandi's messaging automation dashboard" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/if_connected1.png" /></p>
<p>Expandi's messaging automation dashboard (Source: Expandi)</p>
<p>They advertise 300 connection requests per week and limit messages to 100 per day.</p>
<p>Expandi is the most expensive of the three, starting at $99 per month.</p>
<h2 id="the-con-about-doing-linkedin-messages-this-way">The con about doing LinkedIn messages this way</h2>
<p>LinkedIn is not a fan of automation at all. Here's <a href="https://www.linkedin.com/help/linkedin/answer/a1340567?ref=nubela.co">their official stance</a>:</p>
<blockquote>
<p>LinkedIn is committed to keeping our members' data safe and our platform free from fraud and abuse. In order to protect our members' privacy and keep LinkedIn a trusted platform for authentic interactions, we don't allow the use of third-party software or browser extensions that scrape, modify the appearance of, or automate activity on LinkedIn's website.</p>
</blockquote>
<p>And to be fair, they're pretty good at enforcing that.</p>
<p>These <a href="https://nubela.co/blog/best-linkedin-automation-tools/">LinkedIn automation tools</a> can only work around LinkedIn's limits so well. At the end of the day, the platform is hostile to automation by design. That's why all of these tools share roughly the same constraints.</p>
<p>It's a cat-and-mouse game. If you automate LinkedIn messages this way, the account is always at some level of risk. At scale, people end up rotating accounts.</p>
<p>This is why plenty of teams use LinkedIn as one touchpoint, but not the entire outreach engine. There's a reason cold email and cold calling are still around, and <a href="https://nubela.co/blog/how-cold-emailing-grew-my-b2b-startup-to-100k-mrr/">that's because they still work</a>.</p>
<p>That said, there are better ways to use LinkedIn data for outreach without being trapped inside LinkedIn messages itself.</p>
<h2 id="enriching-linkedin-contacts-off-platform">Enriching LinkedIn contacts off-platform</h2>
<p>LinkedIn is still the biggest B2B database in the world. That's what makes it useful. It's also what makes it frustrating.</p>
<p>If you stay fully on-platform, you're boxed into connection limits, messaging limits, account risk, and whatever LinkedIn decides to tighten next.</p>
<p>So instead of staying trapped in LinkedIn messages, you can use LinkedIn as the discovery layer and run your actual outreach somewhere you control.</p>
<p>That usually means pulling the information you actually need:</p>
<ul>
<li>Name</li>
<li>Role</li>
<li>Work history</li>
<li>General prospect context</li>
<li>Education history</li>
<li>Phone/email</li>
<li>More</li>
</ul>
<p>The hard part is getting that data reliably at scale.</p>
<p>Doing it yourself means scraping infrastructure, proxies, account rotation, parser maintenance, and constant breakage. When I was running scraping-heavy workflows years ago, that operational tax was the real cost. Not the infra bill. The distraction.</p>
<p>Many developers don't want to deal with that, even if they technically can.</p>
<p>Luckily, you don't have to build the scraping layer yourself.</p>
<h2 id="meet-proxycurl-and-the-ninjapear-update">Meet Proxycurl, and the NinjaPear update</h2>
<p>Over at <a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a>, we scraped hundreds of millions of LinkedIn profiles, companies, people, jobs, and turned that into a B2B data product. The dataset was called <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkDB</a>.</p>
<p>Then we built enrichment APIs on top of it, plus other data sources like Crunchbase.</p>
<blockquote>
<p><strong>Quick update, because this article predates our current product direction:</strong> Proxycurl has since been sunset, and the founder behind Proxycurl is now building <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. I'm leaving the Proxycurl examples here because the workflow still teaches the right lesson. But if you're building this today, I'd use NinjaPear for the off-platform parts that actually matter: prospect discovery, person enrichment from public web sources, and work email lookup.</p>
</blockquote>
<p>Using those kinds of endpoints, you can programmatically pull the B2B data you need and use that to build an outreach system that doesn't depend on LinkedIn messages.</p>
<h2 id="the-api-workflow">The API workflow</h2>
<p>Proxycurl had a bunch of endpoints. Person Profile. Company Profile. Personal phone lookup. Personal email lookup. Work email lookup.</p>
<p>Those URL-in, data-out endpoints worked well for enrichment when you already knew who you wanted.</p>
<p>The more interesting piece was search. The Search API, especially Person Search, let you search across the dataset and then enrich what you found.</p>
<p>If you want the modern equivalent, <a href="https://nubela.co/companies?ref=nubela.co">NinjaPear's Employee API</a> can help with prospect discovery, employee/profile enrichment helps build the person record from public web sources, and work email lookup helps you move the conversation into cold email where you actually control the pipe.</p>
<p>That is the part I would personally bet on now.</p>
<h2 id="programmatically-searching-linkedin-data">Programmatically searching LinkedIn data</h2>
<p>There are a lot of ways to build this kind of workflow, but I'll keep it simple here:</p>
<ol>
<li>Python</li>
<li>A <code>.csv</code> file</li>
<li>An outreach tool</li>
</ol>
<p>Python is easy to work with and great for data manipulation. I picked <code>.csv</code> because every outreach platform on earth seems to support it.</p>
<p>Let's say you run a marketing agency focused on computer <a href="https://macpaw.com/how-to/best-mac-cleaner-software?ref=nubela.co">cleaner software</a> companies, and you want decision-makers, specifically founders and co-founders.</p>
<p>The following Python script uses the legacy Proxycurl Person Search Endpoint plus personal contact endpoints to search for founders at computer software companies and export their contact info:</p>
<pre><code class="language-python">import requests
import csv

# API credentials and endpoint configuration
api_key = 'Your_API_Key_Here'  # Replace with your actual API key
headers = {'Authorization': 'Bearer ' + api_key}
search_api_endpoint = 'https://nubela.co/proxycurl/api/v2/search/person/'
contact_phone_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-contact'
contact_email_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-email'

# Parameters for the initial search request
search_params = {
    'country': 'US',
    'current_role_title': 'founder',
    'current_company_industry': 'computer software',
    'page_size': '1',
    'enrich_profiles': 'enrich',
}

# Output CSV file and headers configuration
output_file = 'enriched_profiles_with_contacts.csv'
fieldnames = [
    'linkedin_profile_url', 'first_name', 'last_name', 'occupation', 'headline',
    'company', 'company_linkedin_profile_url', 'city', 'state', 'personal_phone_number', 'personal_email'
]


def fetch_contact_info(api_endpoint, linkedin_profile_url):
    &quot;&quot;&quot;Fetch personal contact info (phone number or email).&quot;&quot;&quot;
    params = {'linkedin_profile_url': linkedin_profile_url}
    response = requests.get(api_endpoint, headers=headers, params=params)
    if response.status_code == 200:
        data = response.json()
        if 'personal-contact' in api_endpoint:
            return ', '.join(data.get('numbers', []))
        elif 'personal-email' in api_endpoint:
            return ', '.join(data.get('emails', []))
    else:
        print(f&quot;Error fetching contact info from {api_endpoint}: {response.status_code}, {response.text}&quot;)
    return ''


def extract_company_info(profile):
    &quot;&quot;&quot;Extract the most relevant company name and LinkedIn URL from the profile's experiences.&quot;&quot;&quot;
    company_name = ''
    company_linkedin_url = ''
    experiences = profile.get('experiences', [])
    if experiences:
        most_recent_experience = experiences[0]
        company_name = most_recent_experience.get('company', '')
        company_linkedin_url = most_recent_experience.get('company_linkedin_profile_url', '')
    return company_name, company_linkedin_url


def process_and_write_profiles(writer, result_limit):
    &quot;&quot;&quot;Fetch profiles and write their details, including contact info, to the CSV file.&quot;&quot;&quot;
    url = search_api_endpoint
    params = search_params.copy()
    result_count = 0

    while url and result_count &lt; result_limit:
        response = requests.get(url, headers=headers, params=params)
        if response.status_code != 200:
            print(f&quot;Error fetching profiles: {response.status_code}, {response.text}&quot;)
            break

        data = response.json()
        for profile in data.get('results', []):
            if result_count &gt;= result_limit:
                break

            email_info = fetch_contact_info(contact_email_endpoint, profile['linkedin_profile_url'])
            phone_info = fetch_contact_info(contact_phone_endpoint, profile['linkedin_profile_url'])

            profile_details = profile.get('profile', {})
            first_name = profile_details.get('first_name', '')
            last_name = profile_details.get('last_name', '')
            occupation = profile_details.get('occupation', '')
            headline = profile_details.get('headline', '')

            company, company_linkedin_url = extract_company_info(profile_details)

            city = profile_details.get('city', '')
            state = profile_details.get('state', '')

            writer.writerow({
                'linkedin_profile_url': profile['linkedin_profile_url'],
                'first_name': first_name,
                'last_name': last_name,
                'occupation': occupation,
                'headline': headline,
                'company': company,
                'company_linkedin_profile_url': company_linkedin_url,
                'city': city,
                'state': state,
                'personal_phone_number': phone_info,
                'personal_email': email_info,
            })
            result_count += 1

        next_page_url = data.get('next_page')
        if next_page_url and result_count &lt; result_limit:
            url = next_page_url
            params = {}
        else:
            break


with open(output_file, mode='w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    process_and_write_profiles(writer, 10)

    # Add desired result limit above

print(&quot;Completed fetching LinkedIn profile data with contact information.&quot;)
</code></pre>
<p>It's set to generate 10 leads and grab:</p>
<ul>
<li>LinkedIn profile URL</li>
<li>Full name</li>
<li>Occupation</li>
<li>Headline</li>
<li>Company</li>
<li>Company LinkedIn URL</li>
<li>City</li>
<li>State</li>
<li>Personal phone number</li>
<li>Personal email</li>
</ul>
<p>And then it writes the output into <code>enriched_profiles_with_contacts.csv</code>.</p>
<p>It's also worth noting that the Search API supported Boolean operators, so you could use <code>AND</code>, <code>OR</code>, and <code>NOT</code> to refine the query.</p>
<p>So if you wanted only founders instead of founders plus co-founders, you could change:</p>
<pre><code class="language-python">'current_role_title': 'founder'
</code></pre>
<p>to:</p>
<pre><code class="language-python">'current_role_title': 'founder NOT co-founder'
</code></pre>
<p>And if you want more than 10 leads, just change this line:</p>
<pre><code class="language-python">process_and_write_profiles(writer, 10)
</code></pre>
<h2 id="the-modern-ninjapear-version">The modern NinjaPear version</h2>
<p>If I were building this same workflow today, I would not build around LinkedIn messages.</p>
<p>I'd do this instead:</p>
<ol>
<li>Use NinjaPear employee discovery to find the right people at the right companies.</li>
<li>Enrich the person record from public web data.</li>
<li>Use work email lookup to get a verified work email.</li>
<li>Push the result into your sequencer.</li>
<li>Use LinkedIn messages as a support channel, not the main pipe.</li>
</ol>
<p>That is a more durable system.</p>
<p>You control deliverability. You control sequencing. You control the data flow.</p>
<h2 id="turning-b2b-data-into-automated-outreach">Turning B2B data into automated outreach</h2>
<p>We'll use <a href="https://reply.io/?ref=nubela.co">Reply.io</a> in this example because it works well, and yes, they were a customer of ours.</p>
<p><img alt="Reply.io's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/reply.png" /></p>
<p>Reply.io's homepage</p>
<p>Using the same <code>.csv</code> from earlier, you can import each contact and data point into Reply.io and create a sequence.</p>
<p>First, click <strong>People</strong>, then <strong>New import</strong>, then <strong>Import from CSV</strong>.</p>
<p><img alt="Reply.io's import process" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/replyimport.png" /></p>
<p>Reply.io's import process</p>
<p>Then map the data in your <code>.csv</code> to variables inside Reply.io. You can create custom variables for fields that don't already exist.</p>
<p><img alt="Mapping our variables within Reply.io" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/reply.io.png" /></p>
<p>Mapping our variables within Reply.io</p>
<p>Then click <strong>Sequences</strong> and <strong>New sequence</strong> and build the workflow you want.</p>
<p><img alt="Reply.io's sequences" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/reply---seg-2.png" /></p>
<p>Reply.io's sequences</p>
<p>You can make it as simple or as layered as you want, email, text, and yes, Reply.io also supports LinkedIn touches.</p>
<p><img alt="Reply.io's sequence builder" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/reply---seg-1.png" /></p>
<p>Reply.io's sequence builder</p>
<p>And you can personalize the messages with imported variables:</p>
<p><img alt="Repy.io's message editor" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/reply---segmentation.png" /></p>
<p>Repy.io's message editor</p>
<p>Not bad. This is the part that actually matters.</p>
<h2 id="the-barebones-cold-email-option">The barebones cold email option</h2>
<p>If you want to focus on cold email using LinkedIn-derived data, you could use a tool like <a href="https://sendy.com/?ref=nubela.co">Sendy</a>, which is a simple self-hosted email automation tool. I've used it for years. Proxycurl used it too.</p>
<p><img alt="Sendy's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/02/sendyhomepage.png" /></p>
<p>Sendy's homepage</p>
<p>It costs $69 one time and integrates with AWS SES, which costs $0.10 per 1,000 emails.</p>
<p>We published a more detailed guide on using Sendy elsewhere, so I won't go too deep here, but it's straightforward.</p>
<p>The one annoying bit is import. You can work around that with a simple script using the Sendy API after setting up your custom fields.</p>
<pre><code class="language-php">//-------------------- EDIT HERE -----------------------//
$sendy_url = 'https://SendyInstallation.com';
$api_key = 'xxxxxxxxxxxxxx';
$list_id = 'xxxxxxxxxxxxxx'; 
$csv_file = 'enriched_profiles_with_contacts.csv';   
//------------- STOP EDITING HERE --------------------//
ini_set('auto_detect_line_endings',TRUE);
$file_handle = fopen($csv_file, &quot;r&quot;);
$ch = curl_init();

while (!feof($file_handle) ) {
    set_time_limit(0);

    $line_of_text = fgetcsv($file_handle, 1024);
    // Extract the first email if there are multiple emails
    $emails = explode(',', $line_of_text[10]); // Emails are in the 11th column
    $email = isset($emails[0]) ? trim($emails[0]) : '';

    // Check if a phone number is present
    $phone_number = isset($line_of_text[9]) &amp;&amp; !empty($line_of_text[9]) ? $line_of_text[9] : ''; // Phone numbers are in the 10th column

    $fields = array(
        'name' =&gt; urlencode($line_of_text[1] . ' ' . $line_of_text[2]), // Combining first name and last name
        'email' =&gt; urlencode($email), // Using the first email if multiple
        // Add your custom fields here
        'Occupation' =&gt; urlencode($line_of_text[3]), // Occupation is in the 4th column
        'Company' =&gt; urlencode($line_of_text[5]), // Company is in the 6th column
        'City' =&gt; urlencode($line_of_text[7]), // City is in the 8th column
        'State' =&gt; urlencode($line_of_text[8]), // State is in the 9th column
        'PhoneNumber' =&gt; urlencode($phone_number), // Phone number is in the 10th column
        'api_key' =&gt; urlencode($api_key),
        'list' =&gt; urlencode($list_id)
    );

    $fields_string = http_build_query($fields);

    curl_setopt($ch, CURLOPT_URL, $sendy_url.'/subscribe');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

    // Making sure there's a first name and a valid email before sending the request
    if (!empty($line_of_text[1]) &amp;&amp; filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $response = curl_exec($ch);
        if(curl_errno($ch)) {
            echo 'Curl error: ' . curl_error($ch);
        }
        sleep(5);
    }

    echo htmlspecialchars($line_of_text[1], ENT_QUOTES, 'UTF-8');
    echo '&lt;br&gt;';
}

fclose($file_handle);
curl_close($ch);
//------------------------------------------------------//
</code></pre>
<p>Create an <code>import</code> folder in your Sendy installation, create <code>index.php</code>, paste the script, add your Sendy API information at the top, then upload the <code>.csv</code> into that same folder.</p>
<p>After that, go to <code>YourSendyInstall.com/import/index.php</code> and let it run. It may take a while depending on list size.</p>
<p>Then you're ready to run cold email.</p>
<h2 id="you-probably-didnt-need-linkedin-messages-anyway">You probably didn't need LinkedIn messages anyway</h2>
<p>You can still use LinkedIn. I do. Most serious outbound teams do.</p>
<p>I just would not build my whole outbound machine around LinkedIn messages.</p>
<p>From LinkedIn touches to cold email, texting, and sequencers, the better approach is to use LinkedIn for signal and discovery, then run the actual system somewhere you control.</p>
<p>That was the useful part of the old Proxycurl workflow. And it's still the useful part now.</p>
<p>If you're building this today, the current version of that idea is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>: use it for enrichment, employee discovery, work email lookup, and company monitoring, then run the outreach off-platform.</p>
<p>That is simply more durable than depending entirely on LinkedIn messages automation.</p>
<h2 id="create-your-account">Create your account</h2>
<p>If you're ready to build the off-platform version of this workflow, start with <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>.</p>
<p>NinjaPear gives you the current pieces that matter here: person and company enrichment from public sources, employee discovery, work email lookup, and monitoring data you can use to time outreach better.</p>
<p>If you want a hands-on place to do this without building the whole thing from scratch, <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> is also worth looking at. It lets you build prospect lists, enrich rows, and export them into your sequencer-ready workflow.</p>
<p>That is the next step I would take.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ This Is Why Meta Lost the Scraping Legal Battle to Bright Data ]]></title>
        <description><![CDATA[ Meta took Bright Data to court, and the results are probably not as you expect... ]]></description>
        <link>https://nubela.co/blog/meta-lost-the-scraping-legal-battle-to-bright-data/</link>
        <guid isPermaLink="false">65bb2eaa86ccd600018f3ae8</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Mon, 04 Mar 2024 11:18:00 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><em>Note: a few weeks after the first edition of this article was published, Meta announced that they were dropping the lawsuit. We have since then updated this article with the latest developement. In summary, this concluded the case with a clear win for Bright Data.</em></p>
<p>We’re treated to yet another legal drama in the world of web scraping. This time the verdict is out on Meta vs. Bright Data.</p>
<p>Bright Data won, and Meta lost. Yay to the web scraping community.</p>
<p>This win came off the back of a similarly high-profile, years-long [legal battle between hiQ and Professional Social Network](<a href="https://nubela.co/blog/is-Professional">https://nubela.co/blog/is-Professional</a> Social Network-scraping-legal/), which hiQ won and Professional Social Network lost.</p>
<p>That case ended in 2022 and was a  huge win for the web scraping community because it further cemented that scraping a website for data is in fact legal, provided you meet certain requirements.</p>
<p>We highly recommend that you [read the hiQ v. Professional Social Network case](<a href="https://nubela.co/blog/is-Professional">https://nubela.co/blog/is-Professional</a> Social Network-scraping-legal/) alongside this Meta v. Bright Data case, because both address important facts about web scraping.</p>
<p>Now, time to start unpacking the details of this case:</p>
<p>(By the way, if you're already pretty familiar with the web scraping legal world, <a href="https://nubela.co/blog/p/411fe144-3fdf-4d88-8988-90ccf4735075/#key-points-and-summarieswhat-it-meant-for-web-scraping">you can jump straight to the ruling and the key points here</a>.)</p>
<h2 id="who-are-the-players">Who are the players?</h2>
<p>For the benefit of you who want to know in detail the parties involved in this case, here's the background:</p>
<h3 id="meta-facebook">Meta / Facebook</h3>
<p>You should know who Meta is unless you’re a late Gen Z or Gen Alpha or a pure TikToker.</p>
<p>Either way, Meta is a gigantic technology company that owns multiple popular social networking products such as Facebook, Instagram, WhatsApp, and most recently Threads.</p>
<p>With these popular social-related products naturally come large user bases, making Meta a popular scraping target because of that vast and valuable user data.</p>
<h3 id="bright-data">Bright Data</h3>
<p>Bright Data is a web data company headquartered in Israel. The company started its history as a <a href="https://www.911proxy.com/?ref=nubela.co">proxies</a> &amp; IPs provider and in recent years since 2022, it dabbled into web scraping and selling the scraped data in the form of datasets.</p>
<p>Here’s a [full walkthrough of Bright Data](<a href="https://nubela.co/blog/proxycurl-api-vs-brightdatas-Professional">https://nubela.co/blog/proxycurl-api-vs-brightdatas-Professional</a> Social Network-profile-scraper/) as a scraping service.</p>
<h3 id="senior-us-district-judge-edward-chen">Senior U.S. District Judge Edward Chen</h3>
<p>Legal commentaries usually only look at the companies/parties involved. But in this case, the involvement of the presiding judge - <a href="https://www.cand.uscourts.gov/judges/chen-edward-m-emc/?ref=nubela.co">Judge Chen</a> was a very intriguing one. Coincidentally <em>(or not)</em>, he was too the presiding judge of the hiQ v. Professional Social Network case, in which he ruled in favor of the scraping company and against the Professional Social Network platform.</p>
<p>Although his involvement might not and should not be a cause of the ruling for this Meta v. Bright Data case, but interesting nevertheless.</p>
<h2 id="timeline-of-events-in-meta-v-bright-data">Timeline of events in Meta v. Bright Data</h2>
<p>Now that we’re clear on who was involved. Let’s dive in on the drama.</p>
<p>There were five main events:</p>
<ol>
<li>Nov’22: Cease-and-desist initiated by Meta</li>
<li>Jan’23: Meta sued, then Bright Data countersued</li>
<li>May’23: First hearing</li>
<li>Jan’24: Ruling issued: Bright Data won</li>
<li>Feb'24: Meta dropped the lawsuit: web scraping won</li>
</ol>
<p>Starting with…</p>
<h3 id="29-november-2022cease-and-desist-initiated-by-meta">29 November 2022 - Cease-and-desist initiated by Meta</h3>
<p>Meta initiated contact with Bright Data via 1) a video call and 2) an email back in November 2022 for a cease-and-desist. In these communications, Meta demanded that Bright Data stop any scraping activity on Meta’s platforms, in this case, Facebook and Instagram.</p>
<p>In our <em>(non-legal)</em> opinion, these actions by Meta were more to go through the motion to prove that contact was made, so that they can proceed to file a court action later. They for sure didn't expect Bright Data to comply with their demands.</p>
<p>And naturally, Bright Data didn’t. This prompted Meta’s next action:</p>
<h3 id="6-january-2023meta-sued-bright-data">6 January 2023 - Meta sued Bright Data</h3>
<p>Meta sent a reminder letter to Bright Data that day, informing them of their "illegal" scraping activities, and demanded Bright Data to stop these activities immediately.</p>
<p>On the same day, Meta proceeded to sue Bright Data. They filed a complaint with the US District Court for California, claiming:</p>
<blockquote>
<p>a breach of contract and tortious interference.</p>
</blockquote>
<p>This is a very important fact because to Meta, Bright Data was a user and thus its scraping activities violated the Terms of Service (ToS) <strong>as a user</strong>. This was also a key consideration to Judge Chen which will explain the rationale of his ruling - more later.</p>
<h3 id="20-january-2023bright-data-countersued-meta">20 January 2023 -  Bright Data countersued Meta</h3>
<p>Bright Data in return filed their complaint with the US District Court for Delaware.</p>
<h3 id="happenings-in-the-subsequent-months">Happenings in the subsequent months</h3>
<p>The usual legal administrative and procedural steps happened from hereon. We saved you the troubles of going through these months, here are some highlights and references:</p>
<ul>
<li><a href="https://ia804708.us.archive.org/2/items/gov.uscourts.cand.406956/gov.uscourts.cand.406956.1.0.pdf?ref=nubela.co">Meta’s motion</a> was submitted on 6 Jan 2023</li>
<li><a href="https://www.courtlistener.com/docket/66706470/meta-platforms-inc-v-bright-data-ltd/?ref=nubela.co#entry-28">Exact timeline of the case</a></li>
<li><a href="https://www.courtlistener.com/docket/66706470/meta-platforms-inc-v-bright-data-ltd/?ref=nubela.co#entry-28">Case reassigned</a> to <em>legendary web-scraping judge</em> - Judge Chen</li>
<li><a href="https://www.courtlistener.com/docket/66706470/meta-platforms-inc-v-bright-data-ltd/?ref=nubela.co#entry-70">The first hearing</a> on 9 May 2023</li>
<li><a href="https://news.bloomberglaw.com/us-law-week/virtual-court-hearings-earn-permanent-spot-after-pandemics-end?ref=nubela.co">Covid-19 has too transformed the legal world</a>, the proceedings in the whole case <a href="https://www.courtlistener.com/docket/66706470/meta-platforms-inc-v-bright-data-ltd/?ref=nubela.co#entry-70">were mostly through Zoom</a></li>
</ul>
<h3 id="d-day-the-ruling">D-Day: the ruling</h3>
<p>On 23 Jan 2024, <a href="https://ia904708.us.archive.org/2/items/gov.uscourts.cand.406956/gov.uscourts.cand.406956.181.0.pdf?ref=nubela.co">Judge Chen issued his ruling</a>, in favor of Bright Data.</p>
<p>After the ruling, as with past countless court cases related to web scraping, everyone expected the drama to continue brewing and unfolding in the weeks and months to come.</p>
<p>But..</p>
<h3 id="meta-dropped-the-lawsuit-giving-victory-to-web-scraping">Meta dropped the lawsuit, giving victory to web scraping</h3>
<p>On 23 February 2024, one month after the ruling, Meta dropped the lawsuit against Bright Data without further fights.</p>
<p>Definitely an intriguing move but through which we can glean: what did all this mean for web scraping? Is it finally legal? Fully legal, half? Has the case concluded for good for web scraping?</p>
<p>That's what we're going to discuss next:</p>
<h2 id="key-points-and-summarieswhat-it-meant-for-web-scraping">Key points and summaries - what it meant for web scraping</h2>
<p>Nothing is set in stone, there are still many unanswered questions and grey areas, but from what we've seen so far we can say,</p>
<blockquote>
<p><strong>Scrape ahead</strong>!</p>
</blockquote>
<p>As long as your scraping:</p>
<ol>
<li>Involves only [public data](<a href="https://nubela.co/blog/what-is-the-difference-between-Professional">https://nubela.co/blog/what-is-the-difference-between-Professional</a> Social Network-public-profiles-vs-Professional Social Network-private-profiles-with-python-code-samples/) and not private data</li>
<li>Isn’t done while logged in, i.e. not a user of the platform that owns the data</li>
</ol>
<p><a href="https://nubela.co/blog/p/411fe144-3fdf-4d88-8988-90ccf4735075/#6-january-2023meta-sued-bright-data">As mentioned earlier</a>, keep in mind that Meta sued for breach of contract, i.e. they’re suing Bright Data as a user of their products. This was a key point to Judge Chen's ruling.</p>
<p>That said, here are three highlights followed by the judge’s opinions/ruling:</p>
<h3 id="highlight-1-bright-data-scraped-meta-while-being-a-user">Highlight #1: Bright Data scraped Meta while being a user</h3>
<p>How was Bright Data a user? Well, they basically just had some Facebook and Instagram accounts for their corporate and branding purposes as any company would.</p>
<p>Being a user of any platform, you’ll generally need to comply with their Terms of Service (ToS). In this case, it means that Bright Data being a user and scraping the platforms as a user, violated Meta’s ToS - according to Meta.</p>
<p>In Bright Data’s view, however, those Facebook and Instagram accounts were meant as company profiles for branding and marketing purposes. They had nothing to do with Bright Data’s scraping activities.</p>
<p>The judge duly agreed.</p>
<p>Note: due to the case, Bright Data has since <a href="https://www.facebook.com/search/top?q=bright%20data">deleted all their Facebook</a> &amp; Instagram accounts. Try searching for them and you'll find user-created "fake" accounts under the name of Bright Data.</p>
<h3 id="highlight-2-bright-data-scraped-meta-while-not-being-a-user">Highlight #2: Bright Data scraped Meta while <em>not</em> being a user</h3>
<p>Now, because Bright Data has deleted all their Facebook and Instagram profiles, they were no longer a user at that point.</p>
<p>Still, Meta argued that Bright Data was bound by their ToS as an ex- or non-user, and thus their scraping activities on Meta's platforms were still illegal.</p>
<p>Interestingly, Judge Chen again ruled in favor of Bright Data on this point.</p>
<p>Why <em>interestingly</em>? The practice has always been that no matter whether a user or not, any scraping activity will constitute a violation of the ToS  simply because of the nature of ToS being readily available and accessible thus becoming a necessary knowledge on the scrapers' part. Rightfully so, ToS is intended as a protection for platforms.</p>
<p>So, in this case, having ruled in favor of the web scraping company Bright Data, it is a <em><strong>huge</strong></em> win for the scraping community.</p>
<h3 id="highlight-3-bright-data-scraped-public-data-without-being-logged-in">Highlight #3: Bright Data scraped public data without being logged in</h3>
<p>This remained a very important aspect of web-scraping-related cases, [as with hiQ v. Professional Social Network](<a href="https://nubela.co/blog/is-Professional">https://nubela.co/blog/is-Professional</a> Social Network-scraping-legal/). Because precedence has already been set that web scraping of public data is perfectly legal, social platforms can’t limit access to public data because it belongs to, as the name suggests, the public.</p>
<p>To quote <a href="https://ia904702.us.archive.org/19/items/gov.uscourts.ded.81291/gov.uscourts.ded.81291.12.0.pdf?ref=nubela.co">Bright Data’s motion</a>:</p>
<blockquote>
<p><em>"This case is all about public data: whether the public has the right to search public information, or whether Meta can use the courts as a tool to eviscerate that right, even where Meta does not own the data at issue and has no property rights in it...</em><br>
<em>If Bright Data loses this case, the losers are not just Bright Data but the public, whose rights are being taken away."</em></p>
</blockquote>
<p>The last line is quite epic.</p>
<h3 id="parallels-between-meta-v-bright-data-hiq-v-professional-social-network-and-another-2008-case-facebook-v-power-ventures">Parallels between <em>Meta v. Bright Data</em>, <em>hiQ v. Professional Social Network</em>, and another 2008 case: <em>Facebook v. Power Ventures</em></h3>
<p>Looking at the three high-profile web scraping cases of [hiQ v. Professional Social Network](<a href="https://nubela.co/blog/is-Professional">https://nubela.co/blog/is-Professional</a> Social Network-scraping-legal/#a-timeline-of-events), [Facebook v. Power Ventures](<a href="https://nubela.co/blog/is-Professional">https://nubela.co/blog/is-Professional</a> Social Network-scraping-legal/#another-legal-battle-on-web-scrapingfacebook-v-power-ventures) <em>(started as far back as 2008)</em>, and this Meta v. Bright Data case, it is very clear that scraping of public data while being logged off is legal in the eyes of the courts.</p>
<p>In Facebook v. Power Ventures, the scraping itself wasn’t illegal for sure, rather it was Power Venture’s copying of Facebook’s copyrighted page designs and interface wholesale that caused Power Ventures to lose the case.</p>
<p>In hiQ v. Professional Social Network, similarly, the scraping was deemed legal. But it was hiQ’s creation of fake accounts that got them into trouble.</p>
<p>And now in Bright Data’s case, they emerged the full winner because they steered clear of creating fake accounts for scraping purposes and avoided any copyright infringement like Power Ventures did. In other words, they scraped for public data as a non-user, non-logged-in.</p>
<p>Also, did you know that Meta actually employed Bright Data’s services before to scrape other websites? That's a turn of events.</p>
<p>By the way, [the worst of it was done by Mantheos](<a href="https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional">https://nubela.co/blog/what-you-should-know-now-that-mantheos-a-Professional</a> Social Network-scraping-service-is-sued-by-Professional Social Network/), another web scraping company, which got sued and forced to close down because they fraudulently created fake Professional Social Network accounts and fabricated fake debit cards to get access to Professional Social Network Sales Navigator and then scraped millions of those private profiles.</p>
<h2 id="ultimately-we%E2%80%99re-still-treading-along-a-fine-line-when-it-comes-to-web-scraping">Ultimately, we’re still treading along a fine line when it comes to web scraping</h2>
<p>And that is why platforms continue to sue scraping companies year after year after year.</p>
<p>Even with this clear win by Bright Data, and in extension the scraping community, we shouldn’t expect Meta or any data plafrom to accept the defeat for good just like that.</p>
<p>Platforms will continue to sue scraping companies, even Meta themselves have had court cases with countless scraping companies. Professional Social Network is another "culprit".</p>
<p>That happened in hiQ v. Professional Social Network too where Professional Social Network appealed the Court’s decision, which led to the case changing courts a few times, the ruling being backtracked, and it went on for years before both parties settled privately in December 2022.</p>
<p>Web scraping aside, there are better ways of getting data at scale from platforms like Professional Social Network and Facebook without all the headaches - one such way is via <a href="https://nubela.co/proxycurl/products?ref=nubela.co">APIs like ours at Proxycurl</a>, or <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">buying datasets directly</a>.</p>
<p>[Vendors like us](<a href="https://nubela.co/blog/reviewing-top-Professional">https://nubela.co/blog/reviewing-top-Professional</a> Social Network-scraping-api-services/) take care of the complicated, dangerous, and ever-changing landscape of web scraping, including circumventing creative scraping blockers employed by these platforms like CAPTCHAs &amp; IP blocking, while you focus on getting quality data to build your applications.</p>
<p>We hope this <em>non-legal</em> legal commentary helped shed light on this pivotal case, and what it meant for you if you're into web scraping.</p>
<h2 id="the-next-step">The next step?</h2>
<p>Use a data vendor like Proxycurl or Bright Data instead. Create your Proxycurl account, grab your API key, and test out the APIs for yourself:</p>
<p><a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">Click here to create your Proxycurl account now for free.</a></p>
<p><strong>P.S.</strong> Have any questions? No problem, we have answers. Just reach out to us at "<a href="mailto:hello@nubela.co">hello@nubela.co</a>" and we'll get you taken care of ASAP!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Ultimate Guide to Boolean Search Syntax ]]></title>
        <description><![CDATA[ There is a good chance you already know Boolean search syntax if you&#39;re good at Googling, because a lot of advanced search expressions are, in fact, Boolean search. In this guide, we will go a bit further and formally document Boolean search syntax.



Boolean Search Basics. Also, why ]]></description>
        <link>https://nubela.co/blog/ultimate-guide-to-boolean-search-syntax/</link>
        <guid isPermaLink="false">65ded57cada96c0001a04cc6</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 01 Mar 2024 17:36:25 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_388.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>There is a good chance you already know Boolean search syntax if you're good at Googling, because a lot of advanced search expressions are, in fact, Boolean search. In this guide, we will go a bit further and formally document Boolean search syntax.</p>
<h2 id="boolean-search-basics-also-why-boolean-search">Boolean Search Basics. Also, why Boolean Search?</h2>
<p>At the core of Boolean search are expressions that allow you to combine or exclude keywords in specific ways, using a set of operators such as AND, OR, NOT, and more. These expressions can be simple terms, exact phrases, or a complex combination of both, structured to refine your search criteria.</p>
<p>At Proxycurl, we decided to <a href="https://nubela.co/blog/product-update-search-api-v2/">replace regular expressions with Boolean search</a> because:</p>
<ol>
<li>We were getting too many support tickets from users who were tripping up on regular expressions.</li>
<li>We looked at most of the regular expressions given by our users, and they were very basic queries.</li>
</ol>
<p>What if we could have 90% of the power that regular expressions give, but with a dramatically simpler learning curve? Boolean search is the answer.</p>
<h3 id="understanding-the-grammar">Understanding the Grammar</h3>
<p>Let's break down the Boolean grammar that forms the backbone of this search syntax:</p>
<ul>
<li><strong><code>&lt;expression&gt;</code></strong>: This is the basic unit of your search query. It can be a single term, a conditional expression combining multiple terms, or even a group of expressions.</li>
<li><strong><code>&lt;term&gt;</code></strong>: A term can be a single word (e.g., <code>banana</code>), an exact phrase enclosed in quotes (e.g., <code>"banana bread"</code>), or an expression group, which is an expression enclosed in parentheses (e.g., <code>(banana OR bread)</code>).</li>
<li><strong><code>&lt;conditional-expression&gt;</code></strong>: This involves combining terms with operators like AND, OR, NOT, and their symbolic equivalents (<code>&amp;&amp;</code>, <code>||</code>, <code>-</code>) to refine your search.</li>
</ul>
<h3 id="supported-syntax">Supported Syntax</h3>
<ol>
<li><strong>Quotes <code>" "</code></strong>: Search for an exact phrase. Using quotes around your terms (e.g., <code>"banana bread"</code>) will return results containing that exact phrase.</li>
<li><strong>OR <code>||</code></strong>: Use the pipe symbol to search for either term. For instance, <code>bananas || apples</code> will fetch results that include either <code>bananas</code>, <code>apples</code>, or both.</li>
<li><strong>AND <code>&amp;&amp;</code></strong>: Ensure your results include all terms by using the double ampersand. A search like <code>bananas &amp;&amp; apples</code> will only show results that feature both <code>bananas</code> and <code>apples</code>.</li>
<li><strong>NOT <code>-</code></strong> (hyphen): Exclude terms using the hyphen or NOT. For example, <code>bananas -apples</code> will return results that include <code>bananas</code> but exclude any that mention <code>apples</code>.</li>
<li><strong>Parentheses <code>( )</code></strong>: Group terms and operators to form complex queries. A search like <code>(bananas || apples) &amp;&amp; bread</code> will yield results that contain <code>bread</code> and either <code>bananas</code> or <code>apples</code>.</li>
<li><strong>Asterisk <code>*</code></strong>: The asterisk acts as a wildcard operator. Searching for <code>star*</code> might return <code>star</code>, <code>stars</code>, <code>start</code>, and so on, capturing a broader range of terms that share a root. The asterisk wildcard operator cannot be used as a leading operator. It can only be used in the middle or trailing portion of the query. For example, <code>* apple</code> is not allowed. <code>apple * orange</code> and <code>apple*</code> are allowed.</li>
</ol>
<h3 id="crafting-your-search-queries">Crafting Your Search Queries</h3>
<p>To make the most of Boolean search syntax, consider how your query might be interpreted and structure it accordingly:</p>
<ul>
<li><strong>Be specific</strong>: Use exact phrases and conditional expressions to narrow down your search results.</li>
<li><strong>Use parentheses</strong>: Group terms to control the order of operations, just like in mathematics.</li>
<li><strong>Experiment with wildcards</strong>: Wildcards can help you find related terms you might not have considered.</li>
</ul>
<h3 id="examples">Examples</h3>
<p>Here are a few examples to illustrate how you might use Boolean search syntax in practice:</p>
<ul>
<li><strong>Find recipes that must include bananas but not nuts</strong>: <code>"banana bread" -nuts</code></li>
<li><strong>Research articles that mention either climate change or global warming</strong>: <code>("climate change" | "global warming")</code></li>
<li><strong>Find documents that mention technology and either innovation or startups</strong>: <code>technology &amp;&amp; (innovation || startups)</code></li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<p>Mastering Boolean search syntax empowers you to conduct more efficient and effective searches. By understanding and applying the principles outlined in this guide, you can navigate information with precision, save time, and focus on the results that matter most. Practice forming your own Boolean queries and watch how they improve your search game. Happy searching!</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Search API V2 is live! No more regexes, hello Boolean searches ]]></title>
        <description><![CDATA[ We take the iteration process very seriously at Proxycurl. After months of development, we have revamped the Search API and this update for the new Search API is live today!



Now Boolean search, no more regexes


This is how you can search for people who had studied at Caltech or ]]></description>
        <link>https://nubela.co/blog/product-update-search-api-v2/</link>
        <guid isPermaLink="false">65ded4a6ada96c0001a04cbb</guid>
        <category><![CDATA[ changelog ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Fri, 01 Mar 2024 17:33:36 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>We take the iteration process very seriously at Proxycurl. After months of development, we have revamped the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api">Search API</a> and this update for the new Search API is live today!</p>
<h2 id="now-boolean-search-no-more-regexes">Now Boolean search, no more regexes</h2>
<p>This is how you can search for people who had studied at Caltech or MIT, named either "Sarah Jackson" or "Sarah Johnson" today:</p>
<pre><code class="language-shell">curl \
    -G \
    -H "Authorization: Bearer ${YOUR_API_KEY}" \
    'https://nubela.co/proxycurl/api/v2/search/person/' \
    --data-urlencode 'country=US' \
    --data-urlencode 'first_name=Sarah' \
    --data-urlencode 'last_name=Jackson OR Johnson' \
    --data-urlencode 'education_school_name=Caltech OR Massachusetts Institute of Technology'
</code></pre>
<p>Notice that there are <a href="https://nubela.co/blog/regular-expressions-the-proxycurl-search-api/">no more regexes</a>. The Search API now uses <a href="https://nubela.co/blog/ultimate-guide-to-boolean-search-syntax/">Boolean search</a> in place of regular expressions which I believe is a lot easier for most people to pick up and use.</p>
<h2 id="no-more-35-credit-base-cost">No more 35-credit base cost</h2>
<p>Previously Search API had a 35-credit base cost with 3 credits chargeable per result. That was 38 credits if you're doing just one search.</p>
<p>Now,</p>
<blockquote>
<p>No more 35-credit base cost.</p>
</blockquote>
<p>You'll only be charged for 3 credits/result returned. Meaning, you can do ad-hoc searches <em>(even just one)</em> with this revamped Search API.</p>
<h2 id="significant-speed-boost">Significant speed boost</h2>
<p>We have also <strong>significantly improved the speed of Search API</strong>. Most requests should complete in a few seconds as is compared to 60-100s before this revamp.</p>
<p>For more information, check out the API documentation of the updated <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api">Search API</a>. You might also want to check out this guide that we wrote on <a href="https://nubela.co/blog/ultimate-guide-to-boolean-search-syntax/">Boolean searches</a>.</p>
<h2 id="now-now-how-about-search-api-v1">Now, now, how about Search API V1?</h2>
<p>It'll be deprecated with the launch of Search API V2 and it's sunset date will be on 2 April 2024. Thereafter it'll no longer be usable.</p>
<p>We've moved to a better revamped-product that is the Search API V2. You should too!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How Fresh Is the Data from Employee Listing Endpoint or the Search API? ]]></title>
        <description><![CDATA[ Proxycurl&#39;s Employee Listing Endpoint and the Search API are powered by LinkDB. This means that searches are performed within LinkDB. We do not scrape Professional Social Network for employee data or to perform people/company searches.

Since LinkDB is not synced with the latest data on Professional Social ]]></description>
        <link>https://nubela.co/blog/how-fresh-is-the-data-from-employee-listing-endpoint-or-the-search-api/</link>
        <guid isPermaLink="false">65ba1ec986ccd600018f3a87</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Tue, 06 Feb 2024 16:31:27 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Proxycurl's <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-employee-listing-endpoint">Employee Listing Endpoint</a> and the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api">Search API</a> are powered by <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co" rel="noreferrer">LinkDB</a>. This means that searches are performed within LinkDB. We do not scrape Professional Social Network for employee data or to perform people/company searches.</p><p>Since LinkDB is not synced with the latest data on Professional Social Network, you might experience:</p><ol><li>Some profiles that match your query initially, but do not match upon refresh (with the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api-person-profile-endpoint" rel="noreferrer">Person Profile Endpoint</a> using the <code>use_cache=if-recent</code> parameter).</li><li>Some profiles that should be included but are otherwise excluded from our API results.</li></ol><p>To understand this phenomenon, it's important to know that<strong> the results are only as good and fresh as LinkDB</strong>. Here's <a href="https://nubela.co/blog/how-often-is-linkdb-updated/">how we update LinkDB</a>:</p><blockquote>LinkDB is updated with every real-time (API) request to scrape a Professional Social Network profile. Essentially, this methodology keeps data in LinkDB constantly updated, amounting to (up to) millions of profiles a day.</blockquote><p>Furthermore, since the Proxycurl API only works with <a href="https://nubela.co/blog/what-is-the-difference-between-Professional%20Social%20Network-public-profiles-vs-Professional%20Social%20Network-private-profiles-with-python-code-samples/" rel="noreferrer">publicly accessible Professional Social Network profiles</a>, not all Professional Social Network profiles are included within LinkDB.</p><p>As a result, popular profiles (like those of software engineers, CEOs, etc.) are often fresh on LinkDB. Less popular roles and people are updated less frequently. Profiles with their <a href="https://nubela.co/blog/the-ultimate-guide-to-Professional%20Social%20Network-public-profile-visibility/">public profile visibility settings</a> turned off, either fully or partially, will also be a poor match or not matched within the results you expect.</p><hr><p>We do not scrape Professional Social Network for employee data and searches for <a href="https://nubela.co/blog/is-Professional%20Social%20Network-scraping-legal/" rel="noreferrer">legal compliance reasons</a>. This ensures that you can trust Proxycurl to <a href="https://nubela.co/blog/is-Professional%20Social%20Network-scraping-gdpr-compliant/" rel="noreferrer">build your application in a sustainable way</a>.</p><p>Moreover, Professional Social Network search results are <a href="https://nubela.co/blog/how-to-bypass-Professional%20Social%20Network-search-limit/" rel="noreferrer">limited to a maximum of 1000 results</a>. This means that companies with more than 1000 employees will never be returned exhaustively.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Can You Retrieve a List of Employees at a Given Company With the LinkedIn API? ]]></title>
        <description><![CDATA[ Professional Social Network is full of tons of B2B data, especially in relation to employment. What if you could effortlessly tap into this data and use it for your benefit? ]]></description>
        <link>https://nubela.co/blog/how-can-i-retrieve-a-list-of-all-employees-within-a-company-through-the-linkedin-api/</link>
        <guid isPermaLink="false">60c1c204418c82000107dd11</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Fri, 02 Feb 2024 12:21:00 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_385.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Unfortunately, LinkedIn no longer offers any kind of employee listing data through its official API.</p>
<p>If your question is specifically, "Can I get a list of all employees at Apple, Stripe, or any other company through the LinkedIn API?", the practical answer is <strong>no, not through LinkedIn's official API</strong>.</p>
<p>This post originally answered a StackOverflow-style question with Proxycurl as the workaround. That historical explanation still matters, so I am preserving it here. But the product landscape has changed, and I need to be precise about that.</p>
<p>Years ago, someone asked whether it was possible to retrieve a list of all employees who work at a company. You could do this through the LinkedIn UI, but there was no obvious mechanism for this in the v2 API. The old StackOverflow replies referenced LinkedIn's now-obsolete vetted access pathways. That was the gap.</p>
<p>Our answer, then and now, is that you can get a list of employees of a company in two ways:</p>
<ul>
<li>If you scrape LinkedIn profiles exhaustively</li>
<li>If you already have an exhaustive dataset of LinkedIn profiles</li>
</ul>
<p>Each LinkedIn profile contains a list of experiences, each of which links to a company profile URL. So once you have a dataset, the process to create your list consists of two steps:</p>
<ul>
<li>Parse the profiles into JSON so you can easily filter them</li>
<li>Filter the parsed profiles based on who currently works at a particular company</li>
<li>Or filter based on past experiences to find former employees as well</li>
</ul>
<p>And that is exactly what Proxycurl used to do.</p>
<h2 id="how-proxycurls-api-worked">How Proxycurl's API worked</h2>
<blockquote>
<p><strong>Important update:</strong> Proxycurl has been sunset. I founded Proxycurl, and I now work on NinjaPear. I am keeping the Proxycurl examples below because they are still useful for understanding the shape of the problem and the kind of API developers wanted. But if you want a current product path forward, skip to the NinjaPear section further below. NinjaPear does <strong>not</strong> scrape LinkedIn and gives you richer B2B data with <a href="https://nubela.co/blog/is-scraping-linkedin-legal-in-2026/">none of the legal liability</a>.</p>
</blockquote>
<p>The first step to Proxycurl's employee listing product was scraping data from various sources. The primary data source was LinkedIn's public profile graph, with additional sources used for enrichment.</p>
<p>That let us take care of the annoying parts:</p>
<ul>
<li>cookies</li>
<li>proxies</li>
<li>CAPTCHAs</li>
<li>account management</li>
<li>profile parsing</li>
<li>pagination</li>
</ul>
<p>Profiles were parsed into JSON, which made filtering straightforward.</p>
<p>Using that dataset, Proxycurl exposed an Employee Listing Endpoint that let you pull a list of employees for a given LinkedIn company URL.</p>
<p>Here was the simple Python example for pulling Apple employees:</p>
<pre><code class="language-python">import requests

api_key = 'Your_API_Key_Here'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/company/employees/'
params = {
    'url': 'https://www.linkedin.com/company/apple/',
}
try:
    response = requests.get(api_endpoint, params=params, headers=headers)
    print(&quot;Status Code:&quot;, response.status_code)
    print(response.json())
except requests.exceptions.RequestException as e:
    print(&quot;Error:&quot;, e)
</code></pre>
<p>At the time, that was the practical substitute for functionality the official LinkedIn API did not expose.</p>
<h2 id="how-to-use-proxycurls-third-party-linkedin-api-to-pull-a-list-of-employees">How to use Proxycurl's third-party LinkedIn API to pull a list of employees</h2>
<p>Historically, this was the flow.</p>
<h3 id="step-1-create-a-proxycurl-account">Step 1) Create a Proxycurl account</h3>
<p>The first thing you needed to do was create a Proxycurl account and get an API key.</p>
<p>Back then, billing was credit-based. The exact historical pricing and trial mechanics have changed over time, so I am not going to pretend old numbers are still current. Check archived docs if you need the original commercial details.</p>
<h3 id="step-2-set-up-your-environment">Step 2) Set up your environment</h3>
<p>There are plenty of ways to pull data from an API. Pick your language and go.</p>
<p>In the original version of this article, we used Python because it is the fastest way for most engineers to test an API call locally.</p>
<h3 id="searching-for-software-developers-at-apple">Searching for software developers at Apple</h3>
<p>Let's say you wanted to look up current software developers at Apple in the United States.</p>
<p>This was the example:</p>
<pre><code class="language-python">import requests

api_key = 'Your_API_Key_Here'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/company/employees/'
params = {
    'url': 'https://www.linkedin.com/company/apple/',
    'country': 'us',
    'enrich_profiles': 'enrich',
    'role_search': '(?i)Software Developer',
    'page_size': '10',
    'employment_status': 'current',
}
try:
    response = requests.get(api_endpoint, params=params, headers=headers)
    print(&quot;Status Code:&quot;, response.status_code)
    print(response.json())
except requests.exceptions.RequestException as e:
    print(&quot;Error:&quot;, e)
</code></pre>
<p>The point of preserving this code is not to tell you to build against a sunset product. It is to show you the exact query shape developers typically need:</p>
<ul>
<li>company URL</li>
<li>geography filter</li>
<li>role filter</li>
<li>current vs past employment</li>
<li>optional enrichment</li>
<li>pagination</li>
</ul>
<p>That is the real requirement. The official LinkedIn API still does not solve that cleanly for most developers.</p>
<h3 id="step-3-retrieve-data-from-the-api">Step 3) Retrieve data from the API</h3>
<p>If you ran the query successfully, you got a list of employees matching the criteria.</p>
<p>The immediate page would be capped according to the request parameters and enrichment settings, but with pagination you could work through the full result set.</p>
<h3 id="can-i-pull-all-employees-at-a-given-company-with-the-employee-listing-endpoint">Can I pull <em>all</em> employees at a given company with the Employee Listing Endpoint?</h3>
<p>Historically, yes. The only required parameter was the company URL:</p>
<pre><code class="language-python">'url': 'https://www.linkedin.com/company/apple/'
</code></pre>
<p>If you removed the rest of the filters, the endpoint would return the full employee list available in the dataset.</p>
<h2 id="the-catch-with-third-party-linkedin-apis">The catch with third-party LinkedIn APIs</h2>
<p>This part from the old article is still true.</p>
<h3 id="youll-only-get-public-data">You'll only get public data</h3>
<p>If a product is built on public LinkedIn data, it is limited by what is publicly visible.</p>
<p>That means you will not get everything LinkedIn itself can see internally. You will get what is publicly exposed and what the vendor can structure well.</p>
<h3 id="reliability-is-the-real-issue">Reliability is the real issue</h3>
<p>I used to spend real money on tools in this category, and my biggest mistake was pretending the only question was, "Can it scrape?"</p>
<p>That is not the question.</p>
<p>The question is whether the vendor can keep the pipeline stable, legally survivable, and fresh enough that your application does not quietly rot six months later.</p>
<p>That is exactly why I would not start a new project in 2026 by depending on a LinkedIn-scraping workflow if I could avoid it.</p>
<h2 id="what-to-use-now-instead">What to use now instead</h2>
<p>This is the part that needed the update.</p>
<p>If you came here looking for a current production option, Proxycurl is no longer the answer because Proxycurl has been sunset.</p>
<p>The modern alternative is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which gives you similarly structured B2B data for the parts of the workflow that matter, without scraping LinkedIn.</p>
<p>That matters more than it sounds.</p>
<p>Most teams asking for "employee lists from LinkedIn" are actually trying to do one of these jobs:</p>
<ul>
<li>identify the right companies</li>
<li>estimate company size and growth</li>
<li>find the right person at the company</li>
<li>enrich that person's profile</li>
<li>get a verified work email</li>
<li>monitor changes at the account</li>
</ul>
<p>NinjaPear covers those jobs directly.</p>
<h2 id="ninjapear-alternatives-to-old-proxycurl-workflows">NinjaPear alternatives to old Proxycurl workflows</h2>
<p>If your old flow would have used Proxycurl's LinkedIn Employee Listing Endpoint, here is the closest practical replacement stack on NinjaPear.</p>
<h3 id="1-company-headcount-instead-of-raw-employee-lists">1) Company headcount instead of raw employee lists</h3>
<p>Use the <a href="https://nubela.co/company-api?ref=nubela.co">Company API</a> when what you actually need is company intelligence.</p>
<p>The <strong>Employee Count</strong> endpoint returns fresh headcount via real-time web search:</p>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/company/employee-count&quot; \
  --data-urlencode &quot;website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<p>Example response:</p>
<pre><code class="language-json">{ &quot;employee_count&quot;: 8000 }
</code></pre>
<p>This is often enough for:</p>
<ul>
<li>TAM segmentation</li>
<li>lead scoring</li>
<li>growth tracking</li>
<li>territory planning</li>
<li>account prioritization</li>
</ul>
<p>And unlike old LinkedIn-dependent workflows, it does not rely on scraping LinkedIn.</p>
<h3 id="2-company-profile-enrichment">2) Company profile enrichment</h3>
<p>If your next step after employee listing was usually "tell me more about this company," use the <strong>Company Details</strong> endpoint:</p>
<pre><code class="language-bash">curl -G &quot;https://nubela.co/api/v1/company/details&quot; \
  --data-urlencode &quot;website=https://stripe.com&quot; \
  -H &quot;Authorization: Bearer YOUR_API_KEY&quot;
</code></pre>
<p>Example response shape:</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;Stripe&quot;,
  &quot;tagline&quot;: &quot;Financial infrastructure to grow your revenue&quot;,
  &quot;founded_year&quot;: 2010,
  &quot;employee_count&quot;: 8500,
  &quot;executives&quot;: [
    {&quot;name&quot;: &quot;Patrick Collison&quot;, &quot;title&quot;: &quot;Co-founder and CEO&quot;}
  ]
}
</code></pre>
<p>Pricing at the time of writing is <strong>3 credits per call</strong> for Company Details, according to NinjaPear's pricing page.</p>
<h3 id="3-person-lookup-and-enrichment">3) Person lookup and enrichment</h3>
<p>If what you really needed was not <em>everyone</em> at the company but the right person at the company, NinjaPear's <strong>Person Profile</strong> endpoint is the more sensible replacement.</p>
<p>You can look up a person by work email, name + company, or role + company. Pricing is <strong>3 credits per call</strong>.</p>
<p>That gets you structured data like:</p>
<ul>
<li>work history</li>
<li>education</li>
<li>location</li>
<li>public social handles</li>
</ul>
<p>Again, the point is not to recreate LinkedIn mechanically. The point is to complete the downstream workflow.</p>
<h3 id="4-work-email-lookup">4) Work email lookup</h3>
<p>This is the endpoint I wish more teams started with in the first place.</p>
<p>If your end goal is outreach, use NinjaPear's <strong>Work Email Lookup</strong> endpoint. Pricing is <strong>2 credits when email is found</strong> and <strong>0.5 credit on miss</strong>.</p>
<p>In plain English: instead of collecting 1,000 names because it feels productive, just identify the right person and get the verified work email.</p>
<p>That is a much cleaner pipeline.</p>
<h3 id="5-monitor-the-company-after-identification">5) Monitor the company after identification</h3>
<p>A lot of employee-list use cases are really intent-monitoring use cases in disguise.</p>
<p>Once you know the account, <a href="https://nubela.co/company-api?ref=nubela.co">Company Updates</a> can track blog posts and X updates in one timeline for <strong>2 credits per call</strong>. That is often more actionable than a static employee export.</p>
<p>If a company is hiring a new VP, launching a product line, or changing pricing, that signal is usually more valuable than having a stale list of names.</p>
<h2 id="a-practical-replacement-architecture">A practical replacement architecture</h2>
<p>If I were rebuilding the old "list all employees at a company through the LinkedIn API" workflow today, I would not rebuild it literally.</p>
<p>I would do this instead:</p>
<ol>
<li>Resolve the company to its canonical website</li>
<li>Pull Company Details</li>
<li>Pull Employee Count</li>
<li>Identify the target buyer with Person Profile or role-based lookup</li>
<li>Pull verified work email</li>
<li>Monitor the company for changes over time</li>
</ol>
<p>That is a better system.</p>
<p>It gives you:</p>
<ul>
<li>cleaner data</li>
<li>less legal exposure</li>
<li>fewer brittle dependencies</li>
<li>better signal for GTM workflows</li>
</ul>
<h2 id="so-can-the-linkedin-api-do-it">So, can the LinkedIn API do it?</h2>
<p>No.</p>
<p>Not in the straightforward way most developers mean when they ask for a company employee list.</p>
<p>Historically, Proxycurl filled that gap by building a third-party LinkedIn data pipeline. I am leaving those examples in this article because they still explain the problem well.</p>
<p>But Proxycurl has been sunset.</p>
<p>If you need a current path forward, use NinjaPear for the parts of the workflow that actually matter: company details, headcount, person enrichment, work email lookup, and company monitoring. It gives you structured B2B data in the same general shape developers expect, and it does so without scraping LinkedIn.</p>
<p>If that is your use case, start with NinjaPear's free trial, test <strong>Company Details</strong>, <strong>Employee Count</strong>, and <strong>Person Profile</strong> on one target account, and see if that already solves 80% of what you were trying to do with a LinkedIn employee list in the first place.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Need more credits? We&#x27;ve got you covered, simply tweet. ]]></title>
        <description><![CDATA[ We have been listening to your feedback and compliments, and we heard how much you&#39;ve been loving Proxycurl.


Thus the launch of our &quot;Tweet for credits&quot; initiative that serves to reward customers like yourself!


What is it about?


Simply tweet (or post in the terms of ]]></description>
        <link>https://nubela.co/blog/proxycurl-tweet-for-credits/</link>
        <guid isPermaLink="false">65a63823e44b0e0001f4d04c</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Wed, 17 Jan 2024 09:56:06 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>We have been listening to your feedback and compliments, and we heard how much you've been loving Proxycurl.</p>
<p>Thus the launch of our <em>"Tweet for credits"</em> initiative that serves to reward customers like yourself!</p>
<p><em><strong>What is it about?</strong></em></p>
<p>Simply tweet <em>(or post in the terms of x.com)</em> and you'll get rewarded with credits for more Proxycurl goodness.</p>
<p><em><strong>How?</strong></em></p>
<p>Go to your <a href="https://nubela.co/proxycurl/dashboard/billing/buy-credits?ref=nubela.co">Proxycurl dashboard</a>:</p>
<ol>
<li>Click <code>Buy credits</code></li>
<li>Go to <code>Pay-as-you-go</code> section (or <code>Ala-carte</code> for customers with existing subscriptions)</li>
<li>Click <code>Tweet and get free credits</code></li>
</ol>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/SCR-20240112-onec.png" class="kg-image" alt="Tweet and get free Proxycurl credits" loading="lazy" width="2544" height="1292"><figcaption><span style="white-space: pre-wrap;">Check it out in your Proxycurl dashboard</span></figcaption></figure><p>And, you'll see this:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/SCR-20240112-omab.png" class="kg-image" alt="Mechanics for Proxycurl tweet for credits" loading="lazy" width="2570" height="1498"><figcaption><span style="white-space: pre-wrap;">Try it now!</span></figcaption></figure><p>Let us know what you think?</p>
<p>If this feature proves to be popular, we'll enhance it to reward credits at a higher volume/frequency.</p>
<p>Tweet away!</p>
<p>P.S. If you want even more credits at better rates, <a href="https://nubela.co/blog/announcement-new-annual-plans-and-pricing-updates-2024/">we announced our brand new Annual Plans</a> that unlock all Enterprise-grade features for you. Check it out.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ 18 Best LinkedIn Automation Tools for 2026 ]]></title>
        <description><![CDATA[ Professional Social Network can be a great resource for any business, but it’s even better with automation. Discover the top 18 Professional Social Network Automation tools in 2025 ]]></description>
        <link>https://nubela.co/blog/best-linkedin-automation-tools/</link>
        <guid isPermaLink="false">6595d52be44b0e0001f4cabd</guid>
        <category><![CDATA[  ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Tue, 16 Jan 2024 10:52:59 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_383.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Going into 2026, LinkedIn remains an <a href="https://nubela.co/blog/all-50-types-of-linkedin-data-you-can-get-youll-be-surprised/">indispensable resource for many businesses</a>, particularly in the B2B sector.</p>
<p>LinkedIn automation tools allow you to skip the manual process and save time. The only concern really is the off chance of getting banned from the platform, depending on the tool used.</p>
<p>That said, there are many types of LinkedIn automation tools and they all work differently, accomplish different tasks, and appeal to different people and companies.</p>
<p>It can be a bit confusing trying to find the right LinkedIn automation tool for you. That is where I come in.</p>
<p>In today’s article, I’ll review and compare the <strong>18 best LinkedIn automation tools for 2026</strong>, so you can choose the ideal option based on your needs.</p>
<table>
<thead>
<tr>
<th>LinkedIn automation tool</th>
<th>Overall rating (/5)</th>
<th>Pricing</th>
<th>Ease of use</th>
<th>Developer friendliness</th>
<th>Stability</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#1-proxycurl">Proxycurl</a></td>
<td>★★★★½ (4.5/5)</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
</tr>
<tr>
<td><a href="#2-phantombuster">PhantomBuster</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#3-linkedin-scraper">LinkedIn Scraper</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#4-meet-alfred">Meet Alfred</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#5-linked-helper">Linked Helper</a></td>
<td>★★★ (3/5)</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#6-lusha">Lusha</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#7-waalaxy">Waalaxy</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#8-dux-soup">Dux-Soup</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#9-octopus-crm">Octopus CRM</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#10-linkedfusion">LinkedFusion</a></td>
<td>★★★ (3/5)</td>
<td>★★★</td>
<td>★★★</td>
<td>★★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#11-salesflow">Salesflow</a></td>
<td>★★★★ (4/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#12-evaboot">Evaboot</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#13-liprospect">LiProspect</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#14-linkedcamp">LinkedCamp</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#15-linkedin-api-unofficial">LinkedIn API</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#16-dripify">Dripify</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#17-uplead">UpLead</a></td>
<td>★★★★ (4/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#18-zopto">Zopto</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★</td>
</tr>
</tbody>
</table>
<p>But first, let me explain a bit more about LinkedIn automation tools:</p>
<h2 id="the-different-types-of-linkedin-automation-actions">The different types of LinkedIn automation actions</h2>
<h3 id="push-automation">Push automation</h3>
<p>These are actions taken directly on LinkedIn’s platform.</p>
<p>Imagine you're using a tool that helps you interact with LinkedIn as if you were doing it yourself, but more efficiently and automatically. This includes activities like posting updates, sending messages, or issuing connection requests.</p>
<p>The key aspect of push automation tools is that they “push” content or interactions out from your account. General LinkedIn automation tools tend to fall more under the push category.</p>
<p>However, it's important to note that since these actions are tied directly to your personal or business LinkedIn account, there's a risk of account suspension if used excessively or inappropriately.</p>
<h3 id="pull-automation">Pull automation</h3>
<p>On the other side, we have pull automation tools, which are more about data extraction.</p>
<p>Instead of pushing content out, pull automation tools “pull” information in from <a href="https://nubela.co/blog/linkdb-an-exhaustive-dataset-of-linkedin-members-and-companies/">LinkedIn’s vast database</a>.</p>
<p>This could mean gathering data for market research, lead generation, or analyzing trends within your industry.</p>
<p>The advantage here is the ability to leverage LinkedIn's rich B2B data for various business purposes.</p>
<p>(<strong>Note</strong>: If you haven’t already seen our <a href="https://nubela.co/blog/guide-to-linkedin-automation/">Definitive Guide to LinkedIn Automation, you should give it a read here</a> to learn more about the two different types of automation actions mentioned above, and their respective business applications.)</p>
<h2 id="the-different-things-you-can-automate-on-linkedin">The different things you can automate on LinkedIn</h2>
<p>Every single LinkedIn automation tool is going to be either push or pull type, but you can also combine push and pull. And between these two different types of automation actions, there’s a lot you can do with LinkedIn.</p>
<p>For starters, here are a few key things you can automate:</p>
<ul>
<li>Sending LinkedIn connection requests</li>
<li>Sending LinkedIn messages</li>
<li>Posting on LinkedIn</li>
<li>Responding to comments and messages on LinkedIn</li>
<li><a href="https://nubela.co/proxycurl/people-api?ref=nubela.co">Extracting data from LinkedIn</a> (name, email, what they do, who they work for, etc.)</li>
<li>Probably whatever else you’re interested in automating</li>
</ul>
<p>For the most part, you can automate practically every action involved with LinkedIn. You just need to find the right automation tool for your desired tasks.</p>
<p>Okay, now that we’ve covered the basics, let’s define the criteria for determining how to pick the right LinkedIn automation tool for you.</p>
<h2 id="how-to-choose-the-right-linkedin-automation-tool">How to choose the right LinkedIn automation tool</h2>
<p>It’s safe to say picking the perfect LinkedIn automation tool can feel like finding a needle in a haystack.</p>
<p>My plan is to make that process simpler for you.</p>
<p>First, you need to define what you’re actually looking for.</p>
<p>Here's a bit more on how to make that choice:</p>
<h3 id="your-objectives">Your objectives</h3>
<p>This is where you start. Ask yourself, <em>“What am I trying to achieve on LinkedIn?”</em></p>
<p>If you're gunning for more leads, look for a tool with strong lead-generation features.</p>
<p>If it's about spreading the word with killer content, find something that excels in <a href="https://nubela.co/blog/how-salesforge-integrates-rich-prospecting-data-with-chatgpt-to-automatically-personalize-emails/">content marketing automation</a>.</p>
<p>Or maybe you're looking to grow your network? Then a tool that simplifies and amplifies your networking efforts is your go-to.</p>
<p>Match the tool to your goals to ensure it's doing the heavy lifting where you need it most.</p>
<h3 id="budget">Budget</h3>
<p>Let's talk money. While some free tools offer a taste of automation, their limitations can quickly hinder your progress and become a waste of time.</p>
<p>After you move on from the free options, it's tempting to go for the cheapest option but remember, you often get what you pay for.</p>
<p>That said, the most expensive tool isn't always the best either. Weigh the features each tool offers against its price.</p>
<p>If a tool is a bit pricier but pays for itself and more, who cares?</p>
<h3 id="ease-of-use">Ease of use</h3>
<p>While some individuals and/or businesses might require more sophisticated LinkedIn automation tools like an <a href="https://nubela.co/proxycurl/?ref=nubela.co">API</a> <em>(ELI5: like a fast food menu for data)</em> for deeper integration and customization, others may benefit from simpler, more user-friendly tools, like a Google Chrome extension.</p>
<p>Whether you need a more advanced and technical LinkedIn automation tool or a more straightforward solution, we'll guide you to the right choice.</p>
<p>It's also essential to select tools that provide robust support resources like documentation, informative guides, and responsive customer support.</p>
<p>This ensures that, regardless of the complexity of the tool, your team has the necessary resources for a smooth onboarding process and continued learning.</p>
<h3 id="integration-capabilities">Integration capabilities</h3>
<p>This is crucial. Your LinkedIn automation tool should play nice with the other tools in your toolkit.</p>
<p>Can it <a href="https://nubela.co/blog/crm-data-enrichment-the-easiest-way-to-increase-your-sales-conversion-rates/">integrate seamlessly with your CRM</a> or other marketing platforms? This integration streamlines your workflow, making data management and strategy implementation a breeze.</p>
<h3 id="get-this-mix-right-and-youve-got-a-powerful-ally">Get this mix right, and you’ve got a powerful ally</h3>
<p>Choosing the right LinkedIn automation tool is all about balancing your goals, budget, technical experience, and integration needs.</p>
<p>Okay, now that we’ve established the basics as well as the basis for finding the right LinkedIn automation tool for you, let’s start the comparison:</p>
<h2 id="the-top-18-linkedin-automation-tools">The top 18 LinkedIn automation tools</h2>
<h2 id="1-proxycurl">1. Proxycurl</h2>
<p><img alt="Proxycurl's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image19.jpg" /></p>
<p>Proxycurl's homepage</p>
<p>In the nature of transparency, you’re on Proxycurl’s old blog lineage right now. But I’m going to be as neutral and fair as possible here.</p>
<p>While Proxycurl worked great for many businesses, anywhere from VCs to startups and thousands of other B2B use cases, it also was never the right fit for everyone.</p>
<p>Our primary LinkedIn automation tool here was the API. You could use it to automate the process of extracting vast amounts of B2B data from LinkedIn. Then you could use that data for different purposes.</p>
<p>Proxycurl wasn’t just a “LinkedIn scraper,” though. The API was derived from <a href="https://nubela.co/blog/what-is-the-difference-between-linkedin-public-profiles-vs-linkedin-private-profiles-with-python-code-samples/">publicly scraped data</a> available on LinkedIn and then enriched with third-party sources. So it used more than just LinkedIn for its data, which was part of the secret sauce and what made it stand out.</p>
<blockquote>
<p><strong>Update:</strong> Proxycurl has been sunset. I’m the founder behind Proxycurl, and the work I’m doing now is at <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which is a different product with a different data philosophy. NinjaPear does <strong>not</strong> do LinkedIn messaging automation or LinkedIn scraping, but it is a plausible alternative if what you actually need is enrichment, prospecting, and outbound workflows outside of LinkedIn itself. In practice, that means using NinjaPear’s <a href="https://nubela.co/companies?ref=nubela.co">Employee API</a> to prospect people from public web data, its Company and Person profile data for enrichment, and its Work Email capability to plug those people into cold email workflows.</p>
</blockquote>
<p>The API was also designed to be scalable and fit into your systems and workflows. A traditional LinkedIn scraper that’s based in a Google Chrome browser isn’t particularly scalable.</p>
<p>For one, Proxycurl didn’t require you to provide your own LinkedIn accounts. The scraping happened on the vendor side. Whereas a Google Chrome extension would obviously require you to provide your own accounts, proxies, etc. There are a lot more headaches involved in comparison.</p>
<p>You could incorporate Proxycurl into just about any workflow, and you wouldn’t have to worry about much. It just worked and pulled enriched B2B data into your applications, for whatever you needed it for.</p>
<p>That said, <a href="https://nubela.co/proxycurl/docs?ref=nubela.co">Proxycurl had many different API endpoints</a> that all did different things.</p>
<p>Let me show you an example of extracting data from LinkedIn using two of the most commonly used Proxycurl endpoints:</p>
<h3 id="extracting-linkedin-data-with-proxycurl">Extracting LinkedIn data with Proxycurl</h3>
<p>The main endpoint you’d use to extract data from a LinkedIn profile was the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#people-api">Person Profile Endpoint</a>.</p>
<p>Using some simple Python, or your language of choice, you could extract data from any LinkedIn profile you’d like.</p>
<p>The following Python script pulls all the information it can find by using nothing but a LinkedIn profile URL:</p>
<pre><code class="language-python">import requests

api_key = 'Your_API_Key_Here'

headers = {'Authorization': 'Bearer ' + api_key}

api_endpoint = 'https://nubela.co/proxycurl/api/v2/linkedin'

params = {
    'linkedin_profile_url': 'https://www.linkedin.com/in/colton-randolph',
    'extra': 'include',
    'github_profile_id': 'include',
    'facebook_profile_id': 'include',
    'twitter_profile_id': 'include',
    'personal_contact_number': 'include',
    'personal_email': 'include',
    'inferred_salary': 'include',
    'skills': 'include',
    'use_cache': 'if-recent',
    'fallback_to_cache': 'on-error',
}

response = requests.get(api_endpoint, params=params, headers=headers)

print(f&quot;Status Code: {response.status_code}&quot;)
print(&quot;Response Content:&quot;)
print(response.json)
</code></pre>
<p>Pretty easy, and the best part is it was incredibly convenient. You just needed a basic level of technical knowledge and the ability to copy and paste a Python script. <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#company-api-company-profile-endpoint">You could also do this for LinkedIn companies as well</a>.</p>
<p>Now let me show you another option:</p>
<h3 id="instantly-tap-into-a-huge-linkedin-data-set-zero-scraping-required">Instantly tap into a huge LinkedIn data set, zero scraping required</h3>
<p>The second option was if you weren’t actively pulling specific prospects, profile by profile, and enriching them. In that case, you could search through the massive LinkedIn dataset called <a href="https://nubela.co/proxycurl/linkdb?ref=nubela.co">LinkDB</a> via the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-person-search-endpoint">Person Search Endpoint</a>.</p>
<p>While the full LinkedIn dataset was also sold via LinkDB, the Person Search Endpoint was powered by that same data set. It included hundreds of millions of publicly scraped profiles on people and companies.</p>
<p>It provided probably the most convenient way to access LinkedIn’s data without having to do any scraping at all. This time you didn’t even need LinkedIn profile URLs either. You could search by specifying parameters that would identify your ideal prospect.</p>
<p>Let’s say you’re looking to reach out to software developers. The following Python would search the entire database for “software developers”:</p>
<pre><code class="language-python">import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}

api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'

params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'past_role_title':'(?i)software developer',
}

response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
</code></pre>
<p>Then if you wanted to narrow this down further, there were additional parameters you could use. For example, adding the following:</p>
<pre><code class="language-python">'past_company_linkedin_profile_url': 'https://www.linkedin.com/company/stripe',
</code></pre>
<p>Would then search for software developers working at Stripe.</p>
<p>There were dozens of other different ways you could customize your search. Just <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-person-search-endpoint">view all of the search parameters on the documentation here</a>. You could also <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-company-search-endpoint">search for companies</a> as well.</p>
<p>Either way, between the respective endpoints, you had several convenient options to have tons of B2B data at your fingertips.</p>
<p>If your real need today is <strong>not</strong> LinkedIn automation itself, but enrichment plus outbound, I’d look at NinjaPear in parallel. It gives you a different workflow: prospect from public web data, enrich person and company records, find work emails, then run cold email or CRM workflows without touching LinkedIn messaging automation at all.</p>
<h3 id="who-proxycurl-is-for">Who Proxycurl is for</h3>
<p>Proxycurl was best for businesses needing extensive B2B data extraction from LinkedIn, suitable for VCs, startups, and other various B2B use cases, specifically marketing and sales.</p>
<p>Proxycurl was ideal for developers or people with some technical backgrounds that valued stability and scalability. It could be built into any application or workflow.</p>
<h3 id="proxycurl-pricing">Proxycurl pricing</h3>
<p>It used a credit-based system to charge for API actions.</p>
<p>You can <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">learn more about the legacy pricing here</a>, but at this point I’d treat this as historical context, not an active buying option, because Proxycurl itself has been sunset.</p>
<h3 id="proxycurl-ratings">Proxycurl ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★☆☆ (3/5)<br />
Developer friendliness: ★★★★★ (5/5)<br />
Stability: ★★★★★ (5/5)<br />
Overall: ★★★★½ (4.5/5)</p>
<h2 id="2-phantombuster">2. PhantomBuster</h2>
<p><img alt="PhantomBuster's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image6.jpg" /></p>
<p>PhantomBuster's homepage</p>
<p>No coding skills? No problem.</p>
<p>PhantomBuster bridges the gap with its user-friendly interface and powerful automation features like the LinkedIn Network Booster and Profile Scraper.</p>
<p>It primarily relies on a browser extension to automate actions, but once you install the browser extension it’s pretty easy to select a variety of different automation actions, like scraping a profile, and so on.</p>
<p><img alt="PhantomBuster's LinkedIn automation possibilities" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image14.jpg" /></p>
<p>PhantomBuster's LinkedIn automation possibilities</p>
<p>Generally speaking the biggest limitation of PhantomBuster is the same limitation of about any browser extension. They’re convenient and easy to get the hang of, but they’re also not scalable at all.</p>
<p>At the end of the day, automation is against LinkedIn’s rules, so when you’re using a browser extension you’ll always be using your own accounts. You can automate intelligently and get by for a while, but it’s always a risk.</p>
<p>And if you’re extracting data at scale from LinkedIn you will get your accounts limited and/or banned. It’s a fact.</p>
<p>That’s just something you’ll have to deal with, with browser extensions. PhantomBuster included.</p>
<p>But it’s certainly a valuable LinkedIn automation tool, nonetheless.</p>
<h3 id="who-phantombuster-is-for">Who PhantomBuster is for</h3>
<p>Ideal for users who prefer a user-friendly interface without requiring coding skills. It offers various automation features, including the LinkedIn Network Booster and Profile Scraper, and is more suitable for individual users or small teams.</p>
<h3 id="phantombuster-pricing">PhantomBuster pricing</h3>
<p>PhantomBuster starts at $69 per month and that includes the possibility of running 5 Phantoms, different automation actions, concurrently. That also limits you to 20 hours per month of automation execution time.</p>
<p>You can increase those numbers by upgrading to the next package at $159 per month and you’ll receive 80 hours of execution time and 15 Phantoms respectively.</p>
<p>The next package more than triples those amounts and will run you $439 per month.</p>
<h3 id="phantombuster-ratings">PhantomBuster ratings</h3>
<p>Pricing: ★★★☆☆ (3/5)<br />
Ease of use: ★★★★★ (5/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★☆☆ (3/5)<br />
Overall: ★★★½☆ (3.5/5)</p>
<h2 id="3-linkedin-scraper">3. LinkedIn Scraper</h2>
<p><img alt="LinkedIn Scraper's GitHub repository" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image8.jpg" /></p>
<p>LinkedIn Scraper's GitHub repository</p>
<p>LinkedIn Scraper is a free and open-source Python library that allows you to scrape both people and company profiles.</p>
<p>It isn’t very sexy, or user-friendly, you need to be heavily technically inclined to be able to use it, but it can certainly help out for LinkedIn data extraction.</p>
<h3 id="who-linkedin-scraper-is-for">Who LinkedIn Scraper is for</h3>
<p>LinkedIn Scraper is best for technically inclined users who need a basic, no-frills data extraction tool.</p>
<h3 id="linkedin-scraper-pricing">LinkedIn Scraper pricing</h3>
<p>Thanks to the open-source community, this project can be tested and used by anyone for free.</p>
<h3 id="linkedin-scraper-ratings">LinkedIn Scraper ratings</h3>
<p>Pricing: ★★★★★ (5/5)<br />
Ease of use: ★★☆☆☆ (2/5)<br />
Developer friendliness: ★★★★★ (5/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="4-meet-alfred">4. Meet Alfred</h2>
<p><img alt="Meet Alred's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image9.jpg" /></p>
<p>Meet Alred's homepage</p>
<p>Meet Alfred takes outreach to the next level.</p>
<p>It definitely leans on the data extraction, lead generation, CRM and outreach side of things. But it does indeed have other basic LinkedIn automation features like post-scheduling.</p>
<p>If you’re looking to extract data and immediately put it into outreach sequences, it’s definitely a good LinkedIn automation tool to give a try:</p>
<p><img alt="Meet Alfred's LinkedIn automation possibilities" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image13.jpg" /></p>
<p>Meet Alfred's LinkedIn automation possibilities</p>
<h3 id="who-meet-alfred-is-for">Who Meet Alfred is for</h3>
<p>Geared towards users focusing on data extraction, lead generation, CRM, and outreach. Suitable for users who want to combine data extraction with immediate outreach sequences.</p>
<h3 id="meet-alfred-pricing">Meet Alfred pricing</h3>
<p>Meet Alfred starts at $59 per month for 3 active campaigns and does not include some of its automation capabilities. You can upgrade to unlimited campaigns and all automation features for $89 per month. After that, enterprise plans are available starting at $345 per month and it includes 5 users.</p>
<h3 id="meet-alfred-ratings">Meet Alfred ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★☆☆ (3/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="5-linked-helper">5. Linked Helper</h2>
<p><img alt="LinkedIn Helper's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image15.jpg" /></p>
<p>LinkedIn Helper's homepage</p>
<p>Linked Helper simplifies essential tasks like sending connection requests, following up with leads, and replying to messages.</p>
<p>It only works via a desktop application:</p>
<p><img alt="LinkedIn Helper's user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image21.jpg" /></p>
<p>LinkedIn Helper's user interface</p>
<p>Of course, you’ll need to provide your own computing power, proxies, and accounts, but it provides a pretty simple, no-frills, way to automate most of the actions you would need on LinkedIn, data scraping, outreach campaigns, a basic CRM.</p>
<h3 id="who-linked-helper-is-for">Who Linked Helper is for</h3>
<p>Linked Helper simplifies tasks like sending connection requests and managing leads. It operates via a desktop application and is suitable for users needing basic LinkedIn automation without sophisticated features.</p>
<h3 id="linked-helper-pricing">Linked Helper pricing</h3>
<p>Linked Helper starts with a free trial, after that, you’re looking at either $15 per month or $45 per month respectively. The difference is the first plan is relatively limited and doesn’t include all of the lead generation features of the more expensive plan.</p>
<h3 id="linked-helper-ratings">Linked Helper ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★☆☆ (3/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★☆☆ (3/5)<br />
Overall: ★★★☆☆ (3/5)</p>
<h2 id="6-lusha">6. Lusha</h2>
<p><img alt="Lusha's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image24-1.jpg" /></p>
<p>Lusha's homepage</p>
<p>Lusha is primarily a data provider with enrichment possibilities. Their most recent offerings are introducing some new outreach automation possibilities as well.</p>
<p>While they don't go out there and blatantly say it, their dataset certainly consists primarily of LinkedIn data.</p>
<p><img alt="Lusha's user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/iScreen-Shoter---Google-Chrome---240104172924.png" /></p>
<p>Lusha's user interface</p>
<h3 id="who-lusha-is-for">Who Lusha is for</h3>
<p>Lusha is primarily a data provider with enrichment capabilities, recently introducing outreach automation features. It's best for users who need a mix of data extraction and outreach automation.</p>
<h3 id="lusha-pricing">Lusha pricing</h3>
<p>Lusha offers a very limited freemium plan, and then after that uses a credit based system. Their cheapest plan starts at $39 per month.</p>
<h3 id="lusha-ratings">Lusha ratings</h3>
<p>Pricing: ★★★☆☆ (3/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★☆☆ (3/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★½☆ (3.5/5)</p>
<h2 id="7-waalaxy">7. Waalaxy</h2>
<p><img alt="Waalaxy's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image3.jpg" /></p>
<p>Waalaxy's homepage</p>
<p>Waalaxy is a Google Chrome extension that focuses more on data extraction than anything but also has some additional messaging features available.</p>
<p>It’s just a very simple Google Chrome extension that exports some data points from LinkedIn, there isn’t much to say about it. It works well.</p>
<p><img alt="Waalaxy's Google Chrome extension on LinkedIn" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image5.png" /></p>
<p>Waalaxy's Google Chrome extension on LinkedIn</p>
<h3 id="who-waalaxy-is-for">Who Waalaxy is for</h3>
<p>Waalaxy is a Google Chrome extension focusing on data extraction. It’s simple and effective for users needing basic <a href="https://www.surfe.com/sales-navigator-list-export/?ref=nubela.co">data export from LinkedIn</a>.</p>
<h3 id="waalaxy-pricing">Waalaxy pricing</h3>
<p>Waalaxy has a limited freemium version. After that, you’re looking at €112 per month and €160 per month respectively. The main difference between the tiers is the amount of invitations you can automate, and the amount of emails you can look up with LinkedIn profile URLs.</p>
<h3 id="waalaxy-ratings">Waalaxy ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="8-dux-soup">8. Dux-Soup</h2>
<p><img alt="Dux-Soup's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image2.jpg" /></p>
<p>Dux-Soup's homepage</p>
<p>Dux-Soup is a Google Chrome extension that automates profile views, lead generation, follow-up sequences, and more.</p>
<p><img alt="Dux-Soup's user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image16.jpg" /></p>
<p>Dux-Soup's user interface</p>
<p>It even allows you to make outreach funnels. It works pretty well for outreach, but it carries the same limitations as all other Google Chrome based LinkedIn automation tools.</p>
<h3 id="who-dux-soup-is-for">Who Dux-Soup is for</h3>
<p>Dux-Soup offers automation for things like profile views, lead generation, and follow-up sequences via a Chrome extension. It's suitable for users wanting to make outreach funnels and basic LinkedIn automations.</p>
<h3 id="dux-soup-pricing">Dux-Soup pricing</h3>
<p>Dux-Soup starts at $14.99 per month for a basic LinkedIn automation barebones version. The next plan will run you $55 per month and includes more integration and outreach options. The largest plan will run you $99 per month and gives you everything as well as “cloud” outreach campaigns, running on their servers, rather than in your browser. But the Google Chrome extension would still be partially required outside of the outreach campaigns.</p>
<h3 id="dux-soup-ratings">Dux-Soup ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★☆☆ (3/5)<br />
Overall: ★★★½☆ (3.5/5)</p>
<h2 id="9-octopus-crm">9. Octopus CRM</h2>
<p><img alt="Octopus CRM's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image11.jpg" /></p>
<p>Octopus CRM's homepage</p>
<p>Octopus CRM is a B2B lead generation powerhouse, offering automated messaging campaigns, detailed analytics, and powerful data enrichment features. It too functions through a Google Chrome extension:</p>
<p><img alt="Octopus CRM's Google Chrome extension" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image7.png" /></p>
<p>Octopus CRM's Google Chrome extension</p>
<p>Octopus CRM specifically caters to marketing and sales teams looking to streamline their lead-generation and conversion process.</p>
<p>It works pretty well for what it’s designed for and does include the normal standard LinkedIn automation features all of these other tools offer. It would be nice if it was cloud-based and operated more like a traditional CRM, though.</p>
<h3 id="who-octopus-crm-is-for">Who Octopus CRM is for</h3>
<p>Octopus CRM is a B2B lead generation tool offering automated messaging campaigns and analytics. A general CRM of sorts. Ideal for marketing and sales teams focusing on lead-generation and outreach.</p>
<h3 id="octopus-crm-pricing">Octopus CRM pricing</h3>
<p>Octopus CRM starts at $9.99 per month with pretty limited features and works its way up to $39.99 per month for unlimited everything. It’s pretty affordable.</p>
<h3 id="octopus-crm-ratings">Octopus CRM ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★☆☆ (3/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="10-linkedfusion">10. LinkedFusion</h2>
<p><img alt="LinkedFusion's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image20.jpg" /></p>
<p>LinkedFusion's homepage</p>
<p>LinkedFusion is a desktop-based LinkedIn automation tool that offers several general LinkedIn automation possibilities.</p>
<p><img alt="LinkedFusion's user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image12.jpg" /></p>
<p>LinkedFusion's user interface</p>
<p>Things like scheduling posts, prospecting, exporting data, outreach automation, and beyond. A pretty good swiss army knife for anyone focused on LinkedIn, specifically sales or marketing.</p>
<p>Though, you will run the risk of getting banned considering you'll be using your own account and will need to consider things like proxies, having a computer running constantly, etc.</p>
<p>It does have quite a bit of integration possibilities, specifically with CRMs.</p>
<h3 id="who-linkedfusion-is-for">Who LinkedFusion is for</h3>
<p>LinkedFusion is a desktop-based tool offering a range of LinkedIn automation features. It's suitable for users focusing on scheduling posts, prospecting, exporting data, and outreach automation.</p>
<h3 id="linkedfusion-pricing">LinkedFusion pricing</h3>
<p>LinkedFusion starts at $69.95 per month and works its way up from there as you gain features.</p>
<h3 id="linkedfusion-ratings">LinkedFusion ratings</h3>
<p>Pricing: ★★★☆☆ (3/5)<br />
Ease of use: ★★★☆☆ (3/5)<br />
Developer friendliness: ★★★☆☆ (3/5)<br />
Stability: ★★★☆☆ (3/5)<br />
Overall: ★★★☆☆ (3/5)</p>
<h2 id="11-salesflow">11. Salesflow</h2>
<p><img alt="Salesflow's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image22.jpg" /></p>
<p>Salesflow's homepage</p>
<p>Salesflow is a LinkedIn Sales Navigator based outreach tool. You can use it without LinkedIn Sales Navigator, but it won’t be nearly as effective.</p>
<p>Its features, like automated email warm-ups, personalized outreach sequences, and deal tracking, make it ideal for sales teams looking to close more deals on LinkedIn. It’ll flawlessly integrate with your CRM.</p>
<p>Though, I’ll admit, my experience with it was a bit clunky. When I signed up my LinkedIn account integration wasn’t working. The platform wouldn’t allow me to remove or change it, and kept redirecting me to sign up for a trial:</p>
<p><img alt="Salesflow's user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image10.jpg" /></p>
<p>Salesflow's user interface</p>
<p>Maybe you’ll have a smoother experience?</p>
<h3 id="who-salesflow-is-for">Who Salesflow is for</h3>
<p>Based on LinkedIn Sales Navigator, it’s ideal for sales teams focusing on personalized outreach sequences, outreach, and closing outbound deals.</p>
<h3 id="salesflow-pricing">Salesflow pricing</h3>
<p>You can start off with a 7-day free trial, and then after that, you’ll start at $99/mo per user, and upwards from there, depending on the quantity of outreach you want to do.</p>
<h3 id="salesflow-ratings">Salesflow ratings</h3>
<p>Pricing: ★★★☆☆ (3/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★★☆ (4/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="12-evaboot">12. Evaboot</h2>
<p>Evaboot takes your existing LinkedIn Sales Navigator subscription to the next level by automating the lead exportation and enrichment process.</p>
<p><img alt="Evaboot's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image25.jpg" /></p>
<p>Evaboot's homepage</p>
<p>You’ll need both a LinkedIn Sales Navigator subscription and to download a Google Chrome extension, but from that point forward, it’s incredibly simple to export LinkedIn leads with Evaboot:</p>
<p><img alt="Evaboot's user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image1.jpg" /></p>
<p>Evaboot's user interface</p>
<h3 id="who-evaboot-is-for">Who Evaboot is for</h3>
<p>Evaboot enhances LinkedIn Sales Navigator by automating lead exportation and enrichment. It's mainly for sales and marketing teams interested in lead generation.</p>
<h3 id="evaboot-pricing">Evaboot pricing</h3>
<p>Evaboot starts at $19 for 1,000 export credits, which does not include emails. For 1,000 export credits that also include emails, you’re looking at $39. It goes up from there, but subscriptions do include discounts as well as bulk purchases.</p>
<h3 id="evaboot-ratings">Evaboot ratings</h3>
<p>Pricing: ★★★★★ (5/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="13-liprospect">13. LiProspect</h2>
<p><img alt="LiProspect's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image27.jpg" /></p>
<p>LiProspect's homepage</p>
<p>LiProspect is a cloud based LinkedIn prospecting tool.</p>
<p>It entirely centers around outreach, and doesn't have anything like scheduling automation or export possibilities.</p>
<p>While it does outreach well, it's pretty limited on everything else. Not a good general tool.</p>
<p>You also do run the risk of getting banned as you'll have to link your account for the outreach.</p>
<h3 id="who-liprospect-is-for">Who LiProspect is for</h3>
<p>LiProspect is a cloud-based prospecting tool centered around outreach. It's suitable for users needing a specialized tool for LinkedIn outreach.</p>
<h3 id="liprospect-pricing">LiProspect pricing</h3>
<p>LiProspect has one plan for $44.95 per month.</p>
<h3 id="liprospect-ratings">LiProspect ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★☆☆ (3/5)<br />
Overall: ★★★½☆ (3.5/5)</p>
<h2 id="14-linkedcamp">14. LinkedCamp</h2>
<p><img alt="LinkedCamp's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image26.jpg" /></p>
<p>LinkedCamp's homepage</p>
<p>LinkedCamp is a cloud-based tool that offers a comprehensive suite of automation features for lead generation, prospecting, and engagement.</p>
<p>It leans heavily on its outreach automation possibilities:</p>
<p><img alt="LinkedCamps outreach automation" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/iScreen-Shoter---Google-Chrome---240105171406.png" /></p>
<p>LinkedCamp's outreach automation</p>
<h3 id="who-linkedcamp-is-for">Who LinkedCamp is for</h3>
<p>LinkedCamp offers a comprehensive suite of automation features for lead generation and engagement. It's ideal for users needing cloud-based LinkedIn outreach automation.</p>
<h3 id="linkedcamp-pricing">LinkedCamp pricing</h3>
<p>LinkedCamp starts at $69 per month and works its way up from there.</p>
<h3 id="linkedcamp-ratings">LinkedCamp ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★☆☆☆ (2/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="15-linkedin-api-unofficial">15. LinkedIn API (unofficial)</h2>
<p><img alt="LinkedIn API's GitHub repository" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image23.jpg" /></p>
<p>LinkedIn API's GitHub repository</p>
<p>LinkedIn API is a third-party and free, open-source Python API available on GitHub. It allows you to programmatically send messages, get jobs, and search LinkedIn profiles.</p>
<p>While LinkedIn API offers a powerful means to interact with LinkedIn data, it is essential to note that it requires technical expertise to implement effectively. It's more suited towards developers.</p>
<p>Be willing to debug a little bit and figure things out.</p>
<h3 id="who-linkedin-api-is-for">Who LinkedIn API is for</h3>
<p>LinkedIn API is a free and open-source Python API for interacting with LinkedIn data. It's best suited for developers.</p>
<h3 id="linkedin-api-unofficial-pricing">LinkedIn API (unofficial) pricing</h3>
<p>Entirely free.</p>
<h3 id="linkedin-api-unofficial-ratings">LinkedIn API (unofficial) ratings</h3>
<p>Pricing: ★★★★★ (5/5)<br />
Ease of use: ★★☆☆☆ (2/5)<br />
Developer friendliness: ★★★★★ (5/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="16-dripify">16. Dripify</h2>
<p><img alt="Dripify's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image17.jpg" /></p>
<p>Dripify's homepage</p>
<p>Dripify is a comprehensive LinkedIn automation platform designed to simplify and enhance marketing efforts on LinkedIn.</p>
<p>It offers a range of features, including automated messaging, lead generation, and campaign management.</p>
<p>It provides tools for creating and executing automated LinkedIn outreach campaigns, making it easier for businesses to engage with prospects and nurture leads.</p>
<p><img alt="Dripify automations" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/iScreen-Shoter---Google-Chrome---240105172559.png" /></p>
<p>Dripify automations</p>
<h3 id="who-dripify-is-for">Who Dripify is for</h3>
<p>Dripify is a comprehensive platform designed for marketing on LinkedIn, offering automated messaging and campaign management. It's suitable for businesses focusing on automated LinkedIn outreach campaigns.</p>
<h3 id="dripify-pricing">Dripify pricing</h3>
<p>Dripify starts at $39 per month for a limited plan and works its way up from there.</p>
<h3 id="dripify-ratings">Dripify ratings</h3>
<p>Pricing: ★★★★☆ (4/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★☆☆ (3/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="17-uplead">17. UpLead</h2>
<p><img alt="UpLead's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/image4.jpg" /></p>
<p>UpLead's homepage</p>
<p>UpLead is a B2B lead extraction platform that helps businesses find and connect with potential customers. It offers a database of verified B2B contacts and companies, enabling users to build targeted prospect lists.</p>
<p>While they don't really explicitly say it, it definitely does come from scraping LinkedIn. It works well for lead generation and enrichment, but there aren't many automation possibilities.</p>
<p><img alt="UpLead user interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/iScreen-Shoter---Google-Chrome---240105174332.png" /></p>
<p>UpLead user interface</p>
<h3 id="who-uplead-is-for">Who UpLead is for</h3>
<p>UpLead is a B2B lead extraction platform, ideal for building targeted prospect lists. It's for businesses focusing on lead generation and enrichment.</p>
<h3 id="uplead-pricing">UpLead pricing</h3>
<p>UpLead starts with a free trial and a few trial credits, but after that the first plan will run you $99 per month, and works its way up from there using a credit based system.</p>
<h3 id="uplead-ratings">UpLead ratings</h3>
<p>Pricing: ★★★☆☆ (3/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★★☆ (4/5)<br />
Stability: ★★★★☆ (4/5)<br />
Overall: ★★★★☆ (4/5)</p>
<h2 id="18-zopto">18. Zopto</h2>
<p><img alt="Zopto's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/iScreen-Shoter---Google-Chrome---240103171117.png" /></p>
<p>Zopto's homepage</p>
<p>Zopto focuses on sales outreach specifically, and adds in LinkedIn as another channel, LinkedIn messages and posts.</p>
<p>Relatively similar to Dripify and LinkedCamp, but all have their own slight differences.</p>
<p>Outside of sales outreach, it's cloud-based and adds in a hint of AI like just about every tool out there nowadays.</p>
<p>If you're looking for cross-platform sales outreach, it's not a bad tool to give a try.</p>
<p><img alt="" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/zopto-1024x576.png" /></p>
<h3 id="who-zopto-is-for">Who Zopto is for</h3>
<p>Zopto focuses on sales outreach, adding LinkedIn as an outreach channel. It's suitable for users seeking cross-platform sales outreach and those needing LinkedIn cloud-based solutions with a hint of AI.</p>
<h3 id="zopto-pricing">Zopto pricing</h3>
<p>Zopto starts at $195 per month and works its way up from there, eventually landing at $780 per month for an agency license.</p>
<h3 id="zopto-ratings">Zopto ratings</h3>
<p>Pricing: ★★★☆☆ (3/5)<br />
Ease of use: ★★★★☆ (4/5)<br />
Developer friendliness: ★★★☆☆ (3/5)<br />
Stability: ★★★☆☆ (3/5)<br />
Overall: ★★★½☆ (3.5/5)</p>
<h1 id="the-ratings-of-all-18-linkedin-automation-tools">The ratings of all 18 LinkedIn automation tools</h1>
<table>
<thead>
<tr>
<th>LinkedIn automation tool</th>
<th>Overall rating (/5)</th>
<th>Pricing</th>
<th>Ease of use</th>
<th>Developer friendliness</th>
<th>Stability</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#1-proxycurl">Proxycurl</a></td>
<td>★★★★½ (4.5/5)</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★★</td>
<td>★★★★★</td>
</tr>
<tr>
<td><a href="#2-phantombuster">PhantomBuster</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#3-linkedin-scraper">LinkedIn Scraper</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#4-meet-alfred">Meet Alfred</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#5-linked-helper">Linked Helper</a></td>
<td>★★★ (3/5)</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#6-lusha">Lusha</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#7-waalaxy">Waalaxy</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#8-dux-soup">Dux-Soup</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#9-octopus-crm">Octopus CRM</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#10-linkedfusion">LinkedFusion</a></td>
<td>★★★ (3/5)</td>
<td>★★★</td>
<td>★★★</td>
<td>★★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#11-salesflow">Salesflow</a></td>
<td>★★★★ (4/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#12-evaboot">Evaboot</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#13-liprospect">LiProspect</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★</td>
</tr>
<tr>
<td><a href="#14-linkedcamp">LinkedCamp</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#15-linkedin-api-unofficial">LinkedIn API</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★★</td>
<td>★★</td>
<td>★★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#16-dripify">Dripify</a></td>
<td>★★★★ (4/5)</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#17-uplead">UpLead</a></td>
<td>★★★★ (4/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★★</td>
<td>★★★★</td>
</tr>
<tr>
<td><a href="#18-zopto">Zopto</a></td>
<td>★★★½ (3.5/5)</td>
<td>★★★</td>
<td>★★★★</td>
<td>★★★</td>
<td>★★★</td>
</tr>
</tbody>
</table>
<h2 id="all-18-linkedin-automation-tools-features-comparison">All 18 LinkedIn automation tools, Features Comparison</h2>
<table>
<thead>
<tr>
<th>Tool name</th>
<th>Data extraction</th>
<th>General LinkedIn automation</th>
<th>Outreach automation</th>
<th>Who it's for</th>
<th>How it works</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proxycurl</td>
<td>Excellent, enriches data</td>
<td>Focused on profile scraping</td>
<td>None</td>
<td>Marketing and sales teams, VCs, startups, various B2B cases</td>
<td>API &amp; entire dataset</td>
<td>Enriches and scrapes LinkedIn profiles</td>
</tr>
<tr>
<td>PhantomBuster</td>
<td>Good for small-scale</td>
<td>Basic automations</td>
<td>Some</td>
<td>Individual users, small teams</td>
<td>Cloud-based/Browser extension</td>
<td>Automates various LinkedIn tasks</td>
</tr>
<tr>
<td>Meet Alfred</td>
<td>Not much</td>
<td>Automated outreach</td>
<td>Excellent</td>
<td>Small marketing and sales teams</td>
<td>Desktop</td>
<td>Automates LinkedIn outreach</td>
</tr>
<tr>
<td>Waalaxy</td>
<td>Yes, some</td>
<td>Data extraction and outreach related automations</td>
<td>Solid for outreach</td>
<td>Marketing and sales teams</td>
<td>Browser extension</td>
<td>Simplifies LinkedIn outreach</td>
</tr>
<tr>
<td>LinkedIn Scraper</td>
<td>Yes, for technical users</td>
<td>Scraping focused</td>
<td>No</td>
<td>Developers</td>
<td>Desktop/Script</td>
<td>Scrapes LinkedIn data</td>
</tr>
<tr>
<td>Octopus CRM</td>
<td>Some</td>
<td>Data extraction / CRM related automations</td>
<td>Yes</td>
<td>Marketing and sales teams</td>
<td>Browser extension</td>
<td>Manages LinkedIn outreach and sales pipelines</td>
</tr>
<tr>
<td>Linked Helper</td>
<td>Basic</td>
<td>Basic automation</td>
<td>Basic</td>
<td>Developers</td>
<td>Desktop</td>
<td>Provides basic LinkedIn automation</td>
</tr>
<tr>
<td>Lusha</td>
<td>Yes, and enrichment</td>
<td>Data-focused</td>
<td>Outreach possible</td>
<td>Marketing and sales teams</td>
<td>API, web app</td>
<td>Exports and enriches LinkedIn data</td>
</tr>
<tr>
<td>Dux-Soup</td>
<td>Some</td>
<td>Yes, basic automation</td>
<td>Yes</td>
<td>Sales and marketing teams, small scale</td>
<td>Browser extension</td>
<td>Outreach automation, general automations</td>
</tr>
<tr>
<td>LinkedFusion</td>
<td>Some</td>
<td>Yes, general automations</td>
<td>Yes, outreach focused</td>
<td>Sales and marketing teams</td>
<td>Desktop</td>
<td>Automates various LinkedIn tasks</td>
</tr>
<tr>
<td>Salesflow</td>
<td>Yes, for Sales Navigator</td>
<td>Outreach focused</td>
<td>Yes</td>
<td>Sales teams, LinkedIn Sales Navigator users</td>
<td>Cloud-based</td>
<td>Manages sales outreach on LinkedIn</td>
</tr>
<tr>
<td>Evaboot</td>
<td>Yes, for Sales Navigator</td>
<td>Scraping and outreach focused</td>
<td>Some</td>
<td>Sales teams, LinkedIn Sales Navigator users</td>
<td>Browser extension</td>
<td>Exports and enriches leads</td>
</tr>
<tr>
<td>LiProspect</td>
<td>Some</td>
<td>Outreach focused</td>
<td>Yes</td>
<td>Sales and marketing teams</td>
<td>Cloud-based</td>
<td>Focuses on LinkedIn outreach</td>
</tr>
<tr>
<td>LinkedCamp</td>
<td>Some</td>
<td>Outreach focused</td>
<td>Yes</td>
<td>Sales and marketing teams</td>
<td>Cloud-based</td>
<td>Automates outreach on LinkedIn</td>
</tr>
<tr>
<td>LinkedIn API</td>
<td>Yes</td>
<td>Some actions</td>
<td>Yes</td>
<td>Developers, technical use cases</td>
<td>API</td>
<td>Enables some programmable LinkedIn actions</td>
</tr>
<tr>
<td>Dripify</td>
<td>Some</td>
<td>Automated outreach</td>
<td>Yes</td>
<td>Sales and marketing teams</td>
<td>Cloud-based</td>
<td>Automates marketing on LinkedIn</td>
</tr>
<tr>
<td>UpLead</td>
<td>Yes</td>
<td>No LinkedIn automation</td>
<td>Lead generation only</td>
<td>Sales and marketing teams</td>
<td>Cloud-based/API</td>
<td>Extracts and enriches B2B leads</td>
</tr>
<tr>
<td>Zopto</td>
<td>Some</td>
<td>Outreach related automations</td>
<td>Yes</td>
<td>Sales and marketing teams</td>
<td>Cloud-based</td>
<td>Manages sales outreach</td>
</tr>
</tbody>
</table>
<h2 id="best-linkedin-automation-tool-for-data-extraction">Best LinkedIn automation tool for data extraction</h2>
<p><a href="https://proxycurl.com/?ref=nubela.co">Proxycurl</a> is going to win here.</p>
<p>It's not only effective in scraping LinkedIn profiles but also enriches the data, making it ideal for marketing and sales teams, VCs, and various other B2B cases. Anytime you need rich B2B data.</p>
<p>Plus, it works via an API so you have zero risk of getting your own LinkedIn accounts banned, and it's infinitely scalable with zero headaches. You'll be able to flawlessly integrate it with your existing application, systems, or workflow.</p>
<p>That said, because Proxycurl has been sunset, the modern alternative I’d put on your radar is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. It is not a LinkedIn messaging automation tool, and it does not scrape LinkedIn, but if your end goal is still list-building, enrichment, and outbound, NinjaPear is a very plausible replacement workflow.</p>
<h2 id="best-general-linkedin-automation-tool">Best general LinkedIn automation tool</h2>
<p>PhantomBuster, while the master of none, offers a surprising amount of LinkedIn automation possibilities.</p>
<p>It has a bit of everything across the board, and everything works pretty well, so if we're going to say the best general LinkedIn automation tool, I'll have to give it to PhantomBuster.</p>
<h2 id="best-budget-automation-tool">Best budget automation tool</h2>
<p>LinkedIn Scraper and LinkedIn API are both entirely free, so if you're technical or patient, those are worth a try.</p>
<p>Outside of that, both Linked Helper and Dux-Soup are good mentions for basic LinkedIn automation needs on a budget.</p>
<h2 id="best-linkedin-automation-tool-for-outreach">Best LinkedIn automation tool for outreach</h2>
<p>I like both Meet Alfred and Salesflow for outreach. Both are strong contenders.</p>
<p>Octopus CRM is an honorable mention here, too.</p>
<h2 id="conclusion">Conclusion</h2>
<p>The best LinkedIn automation tool depends largely on the specific needs and objectives of the user. While one person might want to extract leads from LinkedIn, the next might want to automate LinkedIn messaging.</p>
<p>Each LinkedIn automation tool has its unique strengths and is tailored to cater to different segments of users, from developers to marketing and sales professionals, and beyond.</p>
<p>That said, if you're looking to extract a lot of B2B data, specifically LinkedIn B2B data, and implement it into your business, workflow, or application at scale, Proxycurl was historically one of the strongest options on this list.</p>
<p>Today, because Proxycurl has been sunset, I’d split the decision in two:</p>
<ul>
<li>If you need <strong>actual LinkedIn messaging / browser automation</strong>, use one of the dedicated LinkedIn automation tools above.</li>
<li>If you need <strong>prospecting, enrichment, and work emails</strong> for outbound workflows, take a look at NinjaPear. It is a different product category, but for a lot of teams it solves the real job they were trying to get done in the first place.</li>
</ul>
<p>Thanks for reading, and hopefully this article helped make the decision on finding the right LinkedIn automation tool for you easier.</p>
<p><strong>P.S.</strong> A lot of teams think they need LinkedIn automation when what they really need is fresher data, better enrichment, and a cleaner way to get from company list to person to verified work email. That’s the lane NinjaPear is building for.</p>
<p>Oh, and if you have any questions about B2B data extraction, enrichment, or outbound workflows in general, don’t hesitate to reach out to us at "<a href="mailto:hello@nubela.co">hello@nubela.co</a>". We'll be glad to help.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How To Delete My Proxycurl Account? ]]></title>
        <description><![CDATA[ You have the option to delete your Proxycurl account at any time within your Proxycurl dashboard.


After successfully deleting your account, here&#39;s what to expect:


 * Loss of access to all your Proxycurl credits.
 * No more access to your old Proxycurl account.
 * Permanent removal of your account and personal ]]></description>
        <link>https://nubela.co/blog/delete-proxycurl-account/</link>
        <guid isPermaLink="false">65a0a874e44b0e0001f4cf58</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Fri, 12 Jan 2024 13:25:33 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>You have the option to delete your Proxycurl account at any time within your Proxycurl dashboard.</p>
<p>After successfully deleting your account, here's what to expect:</p>
<ul>
<li>Loss of access to all your Proxycurl credits.</li>
<li>No more access to your old Proxycurl account.</li>
<li>Permanent removal of your account and personal data from our systems.<br>
If you still wish to proceed with deleting your Proxycurl account, please follow the steps below:</li>
</ul>
<h3 id="1-log-in-to-your-proxycurl-dashboard">1. Log in to your Proxycurl dashboard</h3>
<p>Click on the <em>Log in</em> button on the upper right corner.</p>
<p><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/1.png" alt="1.png" loading="lazy"></p>
<h3 id="2-click-on-change-email">2. Click on Change Email</h3>
<p>On the left hand side, you will see a sidebar menu. From the sidebar menu, under the Account category, click on <em>Change email</em>.</p>
<p><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/2.png" alt="2.png" loading="lazy"></p>
<h3 id="3-click-on-delete-account">3. Click on Delete Account</h3>
<p>From your Proxycurl dashboard, click on the <em>Delete</em> account button.<br>
<img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/3.png" alt="3.png" loading="lazy"></p>
<h3 id="4-select-a-reason">4. Select a Reason</h3>
<p>Select a reason among the choices on what made you decide to delete your Proxycurl account.<br>
<img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/4.png" alt="4.png" loading="lazy"></p>
<h3 id="5-confirm-deletion">5. Confirm Deletion</h3>
<p>Confirm that you would like to proceed on deleting your Proxycurl account. Click on <em>Yes, delete account</em>.<br>
<img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/5.png" alt="5.png" loading="lazy"></p>
<h3 id="6-deletion-completed">6. Deletion Completed</h3>
<p>You are done! Your Proxycurl account has been deleted.<br>
<img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/6.png" alt="6.png" loading="lazy"></p>
<h3 id="we-hope-youll-reconsider-proxycurl">We hope you'll reconsider Proxycurl</h3>
<p>We get it – you wanted to delete your Proxycurl account. If you change your mind, we're here – just <a href="https://nubela.co/proxycurl/auth/register?ref=nubela.co">register for a new account</a>.</p>
<p>If you ever find yourself in need of reliable and efficient data provider services again, please reconsider Proxycurl. Our team is here to support and assist you whenever you may require our services.</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Changelog: You can now limit your monthly auto top-ups ]]></title>
        <description><![CDATA[ Following the previous update on the new smaller auto top-up amounts, we&#39;ve now added the ability to limit your monthly auto top-up amount.


Specifically, you can choose between one of these four limits:


 * $1,000
 * $2,000
 * $5,000
 * $10,000


For those of you who run Proxycurl ]]></description>
        <link>https://nubela.co/blog/changelog-new-monthly-auto-top-ups-limit/</link>
        <guid isPermaLink="false">659b79e1e44b0e0001f4cce3</guid>
        <category><![CDATA[ changelog ]]></category>
        <dc:creator><![CDATA[ Joseph Lim | Head of Marketing ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/03/Screenshot-2023-03-13-at-5.30.12-PM-min.png"/>
        <pubDate>Mon, 08 Jan 2024 12:33:35 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Following the previous update on the <a href="https://nubela.co/blog/changelog-auto-top-up-in-smaller-amounts/">new smaller auto top-up amounts</a>, we've now added the ability to limit your monthly auto top-up amount.</p>
<p>Specifically, you can choose between one of these four limits:</p>
<ul>
<li><code>$1,000</code></li>
<li><code>$2,000</code></li>
<li><code>$5,000</code></li>
<li><code>$10,000</code></li>
</ul>
<p>For those of you who run Proxycurl to power your applications and workflows on a larger scale, the No Limit option is available too.</p>
<p>You can see it in <a href="nubela.co/proxycurl/dashboard/billing/buy-credits">your dashboard on the “Buy credits” page</a>:</p>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2024/01/buy-credits-page.png" class="kg-image" alt="Proxycurl dashboard buy credits page" loading="lazy" width="2394" height="1124"><figcaption><span style="white-space: pre-wrap;">Choose the limit that you want </span></figcaption></figure><p>Check it out now!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ We&#x27;re Introducing New Annual Plans With Additional Discounts and Other Pricing Updates ]]></title>
        <description><![CDATA[ In this new year, we&#39;re fully committing to our long-term customers with the introduction of a new subscription plans. These changes reflect our growth as a company and our commitment to investing resources in serving our customers over the long term. Throughout 2023, we&#39;ve significantly invested ]]></description>
        <link>https://nubela.co/blog/announcement-new-annual-plans-and-pricing-updates-2024/</link>
        <guid isPermaLink="false">6596243ae44b0e0001f4cbab</guid>
        <category><![CDATA[ faq ]]></category>
        <dc:creator><![CDATA[ Steven Goh | CEO ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2019/05/square.jpg"/>
        <pubDate>Thu, 04 Jan 2024 11:26:17 +0800</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>In this new year, we're fully committing to our long-term customers with the introduction of a new subscription plans. These changes reflect our growth as a company and our commitment to investing resources in serving our customers over the long term. Throughout 2023, we've significantly invested in service stability and longevity.</p>
<p>These enhancements include the addition of professional personnel dedicated to serving your needs, featuring dedicated account representatives and customer support teams—extending beyond my personal email replies. Our devoted site reliability team works tirelessly to ensure that your applications powered by Proxycurl continue to function flawlessly.</p>
<p>Stability also means investing in data acquisition. I assure you, we are not a one-trick pony; we have substantially diversified and strengthened our data acquisition infrastructure, ensuring that our service remains operational, regardless of changes in third-party platforms.</p>
<p>Beyond technical improvements, we continue to invest in legal compliance and privacy. This commitment has earned us the trust and reliance of various Fortune 500 companies, including Google, Amazon, and Deloitte, who use our service in a legally compliant manner.</p>
<p>Proxycurl remained consistently online throughout 2023 with minimal service disruptions. Our goal is to maintain this standard. To continue being the most stable and accessible platform for retrieving valuable and fresh B2B data, we are revising our pricing plans to focus more on our long-term customers.</p>
<p>Here are the details:</p>
<h2 id="proxycurls-annual-subscription-plan">Proxycurl's Annual Subscription Plan</h2>
<h3 id="unlock-all-enterprise-grade-proxycurl-features">Unlock All Enterprise-Grade Proxycurl Features</h3>
<p>Our new annual subscription plan will <strong>unlock every Proxycurl feature</strong> for you, regardless of your plan size. Gone are the days of plan-based feature differentiation; as a long-term Proxycurl customer, you will enjoy:</p>
<ul>
<li>Access to 200,000 rows of API logs</li>
<li>Access to teams <em>(coming soon)</em></li>
<li>The ability to generate additional API keys</li>
<li>Get the whole-year credits (or all 12+2 bonus credits) upfront, immediately</li>
</ul>
<p>These features will be unlocked for users on a annual subscription plan over the next few weeks.</p>
<h3 id="annual-plans-credits-are-167-cheaper">Annual Plans Credits are 16.7% Cheaper</h3>
<p>When you sign up for an Annual Plan, you'll receive two additional months' worth of credits. <strong>Essentially, when you pay upfront for the whole 12 months, you get the entire 14 months-worth of credits upfront.</strong></p>
<p>In the table below, you can compare the equivalent amount of credits per month and the cost per credit between an Annual Plan and a Monthly Plan.</p>
<table>
<thead>
<tr>
<th></th>
<th>Starter</th>
<th>Growth</th>
<th>Pro</th>
<th>Ultra</th>
</tr>
</thead>
<tbody>
<tr>
<td>Credits <br> <em>(annual plan)</em></td>
<td>2,917 <br> /mo equiv.</td>
<td>29,167 <br> /mo  equiv.</td>
<td>103,833 <br> /mo equiv.</td>
<td>246,167 <br> /mo equiv.</td>
</tr>
<tr>
<td>Cost / Credit<br>   <em>(annual plan)</em></td>
<td><strong>$0.0167</strong></td>
<td><strong>$0.0103</strong></td>
<td><strong>$0.0086</strong></td>
<td><strong>$0.00771</strong></td>
</tr>
<tr>
<td>Credits<br>   <em>(monthly plan)</em></td>
<td>2,500 <br> /mo</td>
<td>25,000 <br> /mo</td>
<td>89,000 <br> /mo</td>
<td>211,000 <br> /mo</td>
</tr>
<tr>
<td>Cost / Credit<br>   <em>(monthly plan)</em></td>
<td>$0.0196</td>
<td>$0.01196</td>
<td>$0.01</td>
<td>$0.009</td>
</tr>
</tbody>
</table>
<h3 id="differences-annual-plans-vs-monthly-plans">Differences: Annual Plans vs Monthly Plans</h3>
<p>The two main differences between our Annual and Monthly Plans are the payment frequency and the amount of credits you get. The table below outlines the differences:</p>
<table>
<thead>
<tr>
<th></th>
<th>Annual Plan</th>
<th>Monthly Plan</th>
</tr>
</thead>
<tbody>
<tr>
<td>Payment Frequency</td>
<td>Paid annually</td>
<td>Paid monthly</td>
</tr>
<tr>
<td>Credits Awarded</td>
<td>Full 12+2 months credits awarded upfront</td>
<td>Monthly credits awarded monthly</td>
</tr>
<tr>
<td>Credit Expiry</td>
<td>One year</td>
<td>Every month</td>
</tr>
</tbody>
</table>
<p>Expanding from the table, using the <strong>Starter plan</strong> as example: if you subscribe to an <strong>Annual Plan</strong>,</p>
<ul>
<li>you need to pay $588 <em>($49/mo x 12 months)</em> for the year,</li>
<li>and you'll get 35,000 credits <em>(2,500 credits x 14 months)</em> straight away. These credits will expire in one year.</li>
</ul>
<p>In contrast, if you subscribe to a <strong>Monthly Plan</strong>,</p>
<ul>
<li>you continue to pay $49 every month,</li>
<li>and you get the 2,500 credits that expire each month.</li>
</ul>
<p>Finally, Proxycurl's Annual Plans are now live! Check them out in <a href="https://nubela.co/proxycurl/dashboard/billing/buy-credits?ref=nubela.co">your dashboard</a>.</p>
<h3 id="similarity-both-annual-and-monthly-plans-now-has-a-12-month-contract">Similarity: both Annual and Monthly Plans now has a 12-month contract</h3>
<p>Subscription to Monthly Plans will now require an annual contract, meaning a 12-month commitment with monthly payments.</p>
<p>If you're currently subscribed to a monthly plan, we will grandfather your plan, meaning you will not be automatically enrolled into an annual contract, and it requires explicit opt-in from you.</p>
<p>Subsequently, plan upgrades are possible, but downgrades are considered breaking the contract.</p>
<h2 id="other-changes-to-our-pay-as-you-go-pricing-plans">Other Changes to Our Pay-As-You-Go Pricing Plans</h2>
<p>In the coming weeks, we will implement these additional changes to the PAYG pricing plans:</p>
<ul>
<li>Our PAYG plan will remain commitment-free.</li>
<li>Credits under PAYG plans will expire after 18 months of payment inactivity.</li>
<li>The $10 option under the PAYG plan will be a one-time use only, intended for service validation.</li>
<li>And lastly, PAYG prices will be increased by 20%.</li>
</ul>
<p>We do not have a specific ETA for these changes, and these changes will be deployed once ready, without further notification. Please consider these changes when making your purchase decisions.</p>
<hr>
<p>For any questions, please feel free to email us at <a href="mailto:hello@nubela.co">hello@nubela.co</a>!</p>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The Definitive Guide to LinkedIn Automation ]]></title>
        <description><![CDATA[ Learn the two different types of Professional Social Network automation actions, and how you can use them for your benefit. ]]></description>
        <link>https://nubela.co/blog/guide-to-linkedin-automation/</link>
        <guid isPermaLink="false">6573aec2e44b0e0001f4c81b</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Wed, 20 Dec 2023 10:19:34 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_379.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>LinkedIn automation can be categorized into two distinct approaches: push and pull actions.</p>
<p>Push-type automations focus on streamlining individual user activities within LinkedIn, like posting content, messaging, and making connection requests.</p>
<p>On the other hand, pull-type automations are designed to extract substantial amounts of LinkedIn profile data, both companies and people.</p>
<p>These two LinkedIn automation approaches can be used to accomplish several tasks for you with little to no human effort.</p>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/coldemail</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/erickrealz</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">LinkedIn automation is risky as hell regardless of which tool you use. The platform is cracking down harder every year and accounts get restricted constantly even with "safe" sending limits. Our clients who rely on LinkedIn automation usually end up switching back to cold email because the account risk isn't worth it.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/coldemail/comments/1qxongp/top_linkedin_automationoutreach_tools_tested_so/o3y77sf/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<p>I plan to explain more about that later, but first, let me ask you a question:</p>
<h2 id="could-you-benefit-from-any-of-the-following-linkedin-automations">Could you benefit from any of the following LinkedIn automations?</h2>
<p>This isn't an exhaustive list, but I'm willing to bet at least one of the following benefits of LinkedIn automations might catch your eye...</p>
<h3 id="1-get-rid-of-general-repetitive-tasks">1. Get rid of general repetitive tasks</h3>
<p>This one is kind of a given, but it needs to be said: You can automate most LinkedIn tasks that you're doing right now.</p>
<p>All the boring ones, like scheduling posts, sending connection requests, sending messages, and beyond.</p>
<p>That saves you lots of time that can be invested in other, more profitable tasks.</p>
<h3 id="2-generate-lots-of-high-quality-leads">2. Generate lots of high quality leads</h3>
<p>By using LinkedIn data extraction tools like Proxycurl, you can tap into a practically endless amount of high-quality prospects that you have an impressive level of insight on.</p>
<p>Also, LinkedIn data extraction automations can be integrated into your sales and marketing processes and sales funnel, allowing for a more streamlined process from lead generation to conversion.</p>
<h3 id="3-streamline-your-recruitment">3. Streamline your recruitment</h3>
<p>For businesses looking to hire, LinkedIn automation can streamline the recruitment process.</p>
<p>From automatically finding candidates who match specific criteria to initiating first-level interactions, LinkedIn automation tools can save significant time and effort.</p>
<h3 id="4-increase-your-online-presence-and-brand-awareness">4. Increase your online presence and brand awareness</h3>
<p>LinkedIn automation tools help maintain a consistent online presence, keeping your brand visible and your audience engaged.</p>
<p>LinkedIn profiles can be a great source of high quality traffic.</p>
<h3 id="5-monitor-competitors">5. Monitor competitors</h3>
<p>LinkedIn automation can be used to monitor competitors' activities, such as their posting frequency, funding, growth rates, engagement rates, and content strategy.</p>
<p>This information is invaluable for benchmarking your own performance and staying ahead in the market.</p>
<h3 id="6-improve-your-advertising-and-sales-personalization-automatically">6. Improve your advertising and sales personalization, automatically</h3>
<p>LinkedIn automation can help in personalizing the experience for your connections and outreach messages.</p>
<p>By being able to access enriched data on just about any B2B prospect, you can tailor your content, messages, and outreach strategies to meet the specific preferences and interests of your prospect, leading to more meaningful engagements, and ultimately higher response and conversion rates.</p>
<h3 id="7-help-secure-both-funding-and-investment-opportunities">7. Help secure both funding and investment opportunities</h3>
<p>LinkedIn contains tons of data on both VC firms, angel investors, and beyond. On the flip side, it also contains tons of data for startups, employee count, current funding data, employee growth rate, revenue growth.</p>
<p>This means you can scrape this data and use it to both secure funding for your new startup, or if you’re looking for your next unicorn, you can use it to find prime investment opportunities before anyone else.</p>
<h2 id="unfortunately-linkedin-doesnt-provide-official-automation-means">Unfortunately, LinkedIn doesn't provide official automation means</h2>
<p>The reason LinkedIn is worth automating in the first place is the fact that it’s the single largest business-related social media platform. It contains vast amounts of B2B data. There is simply no other larger B2B database than LinkedIn.</p>
<p>Unfortunately for us, Microsoft fully understands the value of the B2B data it has with LinkedIn and charges a pretty penny for it, in many cases hardly providing access at all.</p>
<p>When it comes to trying to buy data from LinkedIn officially, their API, application programming interface, the ELI5 definition is essentially like a fast food menu for data, is super limited, and for all intents and purposes probably off-limits for the use case you want it for.</p>
<p>They generally only allow very boring use cases and there’s been a history of harmless third-party applications and LinkedIn integrations that have had their entire business shut down overnight by relying on LinkedIn’s official API.</p>
<p>Outside of that, they do provide tools like Premium and Recruiter, but they're pretty limited in what they'll let you automate and extract for the most part.</p>
<p>Thus, the need for third-party LinkedIn automation solutions.</p>
<h2 id="what-kind-of-risks-are-associated-with-linkedin-automation">What kind of risks are associated with LinkedIn automation?</h2>
<p>Technically, any kind of automation is more or less off-limits for LinkedIn.</p>
<p>LinkedIn especially doesn’t want you to be extracting any kind of data from their platform at scale because then they can’t sell you the data, though they can’t really prevent the extraction of the publicly available data. They must display a certain amount of information publicly if they want to be able to index on Google, which they do.</p>
<p>So, while the enforcement of “no LinkedIn automation” varies, you should assume any LinkedIn automation activity can get your account banned.</p>
<p>Only use automation tools on LinkedIn accounts you don’t care about.</p>
<p>To be specific, here is LinkedIn’s official policy on prohibited software and extensions: https://www.linkedin.com/help/linkedin/answer/a1340567</p>
<blockquote>
<p>"LinkedIn is committed to keeping its members' data safe and its website free from fraud and abuse. In order to protect our members' data and our website, we don't permit the use of any third party software, including 'crawlers', bots, browser plug-ins, or browser extensions that scrape, modify the appearance of, or automate activity on LinkedIn's website..."</p>
</blockquote>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<div class="reddit-quote" style="border:1px solid #e5e5e5;border-left:4px solid #ff4500;border-radius:8px;padding:16px 18px;margin:24px 0;background:#fafafa;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
<div style="display:flex;align-items:center;gap:8px;font-size:13px;color:#555;margin-bottom:10px;">
<span style="background:#ff4500;color:#fff;padding:2px 8px;border-radius:10px;font-weight:600;">r/automation</span>
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#1a1a1b;">u/ManufacturerBig6988</span>
<span style="color:#878a8c;">· ▲ 2</span>
</div>
<blockquote style="margin:0;padding:0;border:0;color:#1a1a1b;font-size:15px;line-height:1.5;">This is why we don’t automate social platforms. We got banned hard by the algorithm one time for automating these. Just isn’t worth risking your account losing access just to gain back a few hours of manual work.</blockquote>
<div style="margin-top:10px;font-size:12px;"><a href="https://www.reddit.com/r/automation/comments/1r99z95/we_almost_got_our_teams_linkedin_accounts/o7gn0ed/?ref=nubela.co" style="color:#ff4500;text-decoration:none;">View on Reddit →</a></div>
</div>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<h2 id="is-it-legal-to-scrape-data-from-linkedin">Is it legal to scrape data from LinkedIn?</h2>
<p>Providing that you respect the individual privacy settings of any given user on LinkedIn, you should be okay.</p>
<p>Past US cases have cemented the legality of scraping public data from LinkedIn. You can learn more about that separately, but the short version is simple: public data is a very different legal category from private, login-gated data.</p>
<p>Now that we've covered the basics, let's explain the difference between push vs. pull LinkedIn automations and how they work.</p>
<h2 id="push-vs-pull-linkedin-automations">Push vs. pull LinkedIn automations</h2>
<h3 id="push-linkedin-automations">Push LinkedIn automations</h3>
<p>As I mentioned earlier, push automations accomplish things like posting on LinkedIn, sending messages, sending connection requests, etc.</p>
<p>Tools like PhantomBuster and LinkedHelper help with this:</p>
<p><img alt="LinkedIn automation tools interface example" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/7a7d6e58c928.webp" /></p>
<p>They allow you to automate the process of pushing information. Some are cloud-based solutions, but some are also desktop or browser-based solutions.</p>
<p>Push automations will always require that you provide your own LinkedIn account, because you'd obviously be specifically automating actions on that said account.</p>
<p>When using push automations, there is always a chance you can get said account banned.</p>
<h3 id="pull-linkedin-automations">Pull LinkedIn automations</h3>
<p>This all focuses on the action of pulling data from LinkedIn’s vast B2B database.</p>
<p>The primary benefit is that you can use the massive amounts of B2B data in the various use cases mentioned above.</p>
<p>Practically every sales or advertising initiative could be improved with the kind of B2B data you can extract from LinkedIn.</p>
<p>However, like push automations, pull automations tend to work differently depending on the product.</p>
<p>There are a few different options, namely APIs, like Proxycurl historically, but there are also desktop applications and browser extensions as well.</p>
<p>There are even some free and open-source scripts like the pretty well known LinkedIn Scraper project on GitHub, which we used to sponsor, that could assist with this.</p>
<h2 id="why-self-hosting-linkedin-pull-automations-can-be-a-pain">Why self-hosting LinkedIn pull automations can be a pain</h2>
<p>The biggest con about using any self-hosted, desktop, or browser-based LinkedIn scraper or alternative pull based LinkedIn automation is that you'll constantly be rotating accounts.</p>
<p>You will get limited, and your accounts will hit authwalls. Eventually IPs can get blocked entirely.</p>
<p>It's complex to automate pulling data from LinkedIn, particularly at scale, because quite frankly Microsoft engineers are very smart. It takes a combination of several different things like proxies, changing browser fingerprints, CAPTCHA solving, rotating accounts and so on.</p>
<p>That's why many opt for a service like an API, because you can just pull LinkedIn data without any of the headaches required. All of the data is already scraped.</p>
<p>You can easily integrate a third-party LinkedIn API into your workflow, and flawlessly access data pulled from LinkedIn.</p>
<p>Let me explain how:</p>
<h2 id="pulling-linkedin-data-by-profile-with-proxycurl">Pulling LinkedIn data by profile with Proxycurl</h2>
<p>Our old API offered several endpoints, but the main endpoint you’d use to pull data from LinkedIn was the Person Profile Endpoint.</p>
<p>Using some simple Python, or your language of choice, you could extract data from any LinkedIn profile you’d like.</p>
<p>Here’s an example:</p>
<pre><code class="language-python">import requests

api_key = 'Your_API_Key_Here'
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/v2/linkedin'

params = {
    'linkedin_profile_url': 'https://www.linkedin.com/in/colton-randolph',
    'extra': 'include',
    'github_profile_id': 'include',
    'facebook_profile_id': 'include',
    'twitter_profile_id': 'include',
    'personal_contact_number': 'include',
    'personal_email': 'include',
    'inferred_salary': 'include',
    'skills': 'include',
    'use_cache': 'if-recent',
    'fallback_to_cache': 'on-error',
}

response = requests.get(api_endpoint, params=params, headers=headers)
print(f&quot;Status Code: {response.status_code}&quot;)
print(response.json())
</code></pre>
<p>Using the LinkedIn profile URL, that would then return an enriched contact with several data points, including email and phone number, if it was available. You could also do this for LinkedIn companies as well.</p>
<blockquote>
<p><strong>Quick update because this article predates a company transition:</strong> Proxycurl has been sunset. I’m the founder behind Proxycurl, and the work I’m doing now is at <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>. So I’m leaving the Proxycurl examples here because they are still useful for understanding how pull-based LinkedIn automation worked, but if you’re looking for the current path forward from us, it’s NinjaPear. NinjaPear does <strong>not</strong> automate LinkedIn messaging or LinkedIn account activity. Instead, it handles adjacent workflows that most teams actually care about: prospecting, profile enrichment from public web sources, employee search, company data, monitoring, and verified work email lookup for cold outbound.</p>
</blockquote>
<p>If your actual goal is not “press buttons inside LinkedIn” but rather “build a better pipeline around LinkedIn-like intent and B2B research,” NinjaPear is usually the cleaner path.</p>
<p>A few examples:</p>
<ul>
<li>Use the <a href="https://nubela.co/companies?ref=nubela.co">Employee API</a> to find prospective people at a target company.</li>
<li>Use the Employee profile flow to enrich a person from public data sources, without automating LinkedIn account actions.</li>
<li>Use the work email finder to move from person identification to cold email.</li>
<li>Use <a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> if you want a spreadsheet workflow instead of building the whole thing in code.</li>
<li>Use the <a href="https://nubela.co/monitor-api?ref=nubela.co">Monitor API</a> if your real problem is timing, not data collection, and you want alerts when a company changes pricing, publishes a blog post, or posts on X.</li>
</ul>
<p>That last point matters more than people admit. When I was running growth systems myself, timing usually mattered more than another scraped field.</p>
<p>Now let me show you another option for pulling data:</p>
<h2 id="pulling-linkedin-data-by-searching-with-proxycurl">Pulling LinkedIn data by searching with Proxycurl</h2>
<p>The second option is if you’re not actively pulling specific prospects, profile by profile, and enriching them, you could search through a massive LinkedIn-derived dataset via a Person Search Endpoint.</p>
<p>While we used to sell the full dataset directly, the practical use case was simpler than that. You could search a very large body of public profile data without needing to manage scraping infrastructure yourself.</p>
<p>It provided probably the most convenient way to access LinkedIn’s data without having to do any scraping at all. This time you didn’t even need LinkedIn profile URLs either. You could search by specifying parameters that would identify your ideal prospect.</p>
<p>Let’s say you’re looking to reach out to software developers. The following Python would search for software developers:</p>
<pre><code class="language-python">import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'

params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'past_role_title':'(?i)software developer',
}

response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
</code></pre>
<p>If you wanted to narrow this down further, there were additional parameters you could use, for example, adding the following:</p>
<pre><code class="language-python">'past_company_linkedin_profile_url': 'https://www.linkedin.com/company/stripe',
</code></pre>
<p>Would then search for software developers working at Stripe.</p>
<p>There were dozens of other different ways you could customize your search.</p>
<p>The modern NinjaPear equivalent is less about “search LinkedIn at scale” and more about getting to the same business outcome with less platform risk. If what you want is a list of likely buyers, a person profile, a company profile, a work email, or ongoing company-change signals, that’s the part NinjaPear now handles.</p>
<h2 id="combining-pull-and-push-actions">Combining pull and push actions</h2>
<p>By combining pull and push LinkedIn automations, you can come full circle and automate very valuable and time intensive tasks. An example of combining pull and push automations is something like an AI-powered outreach tool, because you're pulling data from LinkedIn, and you're also pushing new data at the same time. Both actions are integrated.</p>
<p>Something like LinkedIn Recruiter and Premium could potentially be considered for this, Recruiter more so than Premium, but if you intend to do off-platform outreach like via email or phone, you’ll have to use a third-party tool.</p>
<p>Other third-party tools like Reply.io would then replace the built in LinkedIn marketing tools.</p>
<p>There are a few other variations similar to Reply.io, many of them incorporating LLMs like ChatGPT in some fashion nowadays in an attempt to further automate the outreach process.</p>
<p>Some tools like PhantomBuster, mentioned above, allow you to do a combination of on-LinkedIn and off-LinkedIn outreach automations.</p>
<p>But this is exactly where I’d draw the line today.</p>
<p>If you want <strong>on-LinkedIn</strong> automated actions, accept the account risk.</p>
<p>If you want <strong>off-LinkedIn</strong> prospecting and enrichment, the cleaner stack is usually:</p>
<ol>
<li>Find target accounts.</li>
<li>Identify likely buyers.</li>
<li>Enrich profiles.</li>
<li>Find verified work emails.</li>
<li>Trigger cold email or SDR workflows.</li>
<li>Monitor company changes so your timing isn’t random.</li>
</ol>
<p>That stack is much closer to what <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> is built for.</p>
<h2 id="where-ninjapear-fits">Where NinjaPear fits</h2>
<p>NinjaPear is not a LinkedIn automation tool. That distinction matters.</p>
<p>It does not send LinkedIn messages, rotate LinkedIn accounts, or pretend to be a stealth browser bot. Good. I would not build that business today.</p>
<p>What it does do is cover the part most GTM teams actually need after the LinkedIn tab closes:</p>
<ul>
<li>Person profile enrichment from public web sources</li>
<li>Company profile enrichment</li>
<li>Employee search</li>
<li>Verified work email lookup</li>
<li>Customer discovery</li>
<li>Competitor discovery</li>
<li>Company monitoring across blogs, websites, and X</li>
</ul>
<p>Here’s the part I like: it is one platform instead of a Frankenstein stack.</p>
<p><img alt="NinjaPear Data Explorer interface" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/7a7d6e58c928-1.webp" /></p>
<p>If your workflow today is “find someone on LinkedIn, copy their name into another tool, guess the company domain, run email verification, then set a reminder to check their company news later,” you already know how stupid that stack feels after a month.</p>
<p>NinjaPear cleans up that part.</p>
<h2 id="are-you-starting-to-get-the-value-of-linkedin-automation-yet">Are you starting to get the value of LinkedIn automation yet?</h2>
<p>I think you are.</p>
<p>Push and pull LinkedIn automations are incredibly valuable in their own right, but they're even more valuable when you combine the two actions.</p>
<p>At that point, you're automating a large portion of your required work in many use cases.</p>
<p>While Proxycurl could not do things like sending messages or emails directly, it worked in the background as a way to pull LinkedIn data into your workflow or application.</p>
<p>Today, the better framing is slightly different.</p>
<p>If your business depends on automating actions <strong>inside</strong> LinkedIn, you are accepting enforcement risk from day one.</p>
<p>If your business depends on getting better B2B data, better timing, and better contactability <strong>around</strong> LinkedIn workflows, you have safer options now.</p>
<p>That’s where NinjaPear fits.</p>
<h2 id="how-we-can-help">How we can help</h2>
<p>If you’re looking for the old Proxycurl-style value, but updated for where the market is now, NinjaPear is the relevant place to start.</p>
<p>The products I’d look at first are:</p>
<ul>
<li><a href="https://nubela.co/prospector?ref=nubela.co">Prospector</a> for spreadsheet-based prospecting workflows</li>
<li><a href="https://nubela.co/monitor-api?ref=nubela.co">Company Monitor</a> for timing and account intelligence</li>
<li>Employee API for person/profile discovery</li>
<li>Company API for company enrichment</li>
<li>Work email lookup for off-platform outreach</li>
</ul>
<p>The big shift is simple.</p>
<p>Instead of building your revenue engine around fragile LinkedIn automation, build it around durable data and better timing.</p>
<p>That tends to survive platform policy changes a lot better.</p>
<h2 id="create-your-ninjapear-account-for-free-today">Create your NinjaPear account for free today</h2>
<p><a href="https://nubela.co/?ref=nubela.co">Click here to get started with NinjaPear</a>.</p>
<p>You’ll get a 3-day free trial with 10 credits included, no credit card required.</p>
<p>If you still came here specifically for LinkedIn automation, my advice is straightforward: use push automation very carefully, on accounts you can afford to lose, and keep most of your actual pipeline generation off-platform.</p>
<p>If you came here because you want the business outcome, more leads, better enrichment, better timing, better outbound, then skip the fragile stuff and start there instead.</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Build a Job Board with Our Professional Social Network Job Scraping API ]]></title>
        <description><![CDATA[ Interested in creating your own job board? Here’s the easiest way to get your job board created – all without requiring doing any scraping of your own, or requiring submissions from companies. ]]></description>
        <link>https://nubela.co/blog/how-to-build-a-job-board-with-this-new-linkedin-job-scraping-api/</link>
        <guid isPermaLink="false">6564f933d6eb9000013bfa37</guid>
        <category><![CDATA[ proxycurl ]]></category>
        <dc:creator><![CDATA[ Colton Randolph | Technical Writer ]]></dc:creator>
        <nubela:avatar url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/08/cr.jpg"/>
        <pubDate>Tue, 05 Dec 2023 11:56:25 +0800</pubDate>
        <media:content url="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2026/05/cover_378.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<p>Building a niche-related job board like remote jobs, software development jobs, etc. has been all the rage recently.</p>
<p>Nowadays you can hardly Google for jobs without being redirected to a job board first.</p>
<p>At first glance, it may seem incredibly complicated to create one, too. After all, you would need to either receive or find all of these jobs to then post on your job board.</p>
<p>But what if I told you that many of these job boards outside of the likes of Indeed and other top job boards are primarily just scraping LinkedIn jobs and then displaying the results and monetizing them in the process?</p>
<p><img alt="Remote oriented job board" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/chrome_WjMRzLRd2n.png" /></p>
<p>Remote oriented job board</p>
<p>Plus, you too could create your very own job board for your desired niche much easier than you think, which means:</p>
<ul>
<li>No scraping of your own required</li>
<li>No finding job posts manually</li>
<li>No having to sift through job post submissions</li>
</ul>
<p>We can actually <strong>automate nearly the entire process of running a job board</strong>. In this blog post, I’ll show you how. Let’s dive in.</p>
<p>First things first:</p>
<h1 id="why-scrape-linkedin">Why scrape LinkedIn?</h1>
<p>LinkedIn is the single largest B2B platform in the world. There’s no other platform that contains <a href="[https://nubela.co/blog/all-50-types-of-linkedin](https://nubela.co/blog/all-50-types-of-linkedin)-data-you-can-get-youll-be-surpised/">as much B2B data as LinkedIn</a>.</p>
<p>Many people recognize this fact. But they also recognize it’s pretty complex and is a game of cat and mouse.</p>
<p>LinkedIn doesn’t want you to scrape their website. They also don’t even really allow you to pay for it. Their API is extremely limited, and they limit access to it to any company that competes in any relatively adjacent industry, which a job board would definitely fall under.</p>
<p>This means two things:</p>
<ol>
<li>While the B2B data on LinkedIn is incredibly valuable, many opt to skip scraping it because it’s a headache to scrape. Which is fair.</li>
<li>To obtain the data on LinkedIn, it’s generally best to obtain it through a third-party API that does not limit you, rather than LinkedIn’s API.</li>
</ol>
<p>That said: that’s what Proxycurl was, a third-party API primarily powered by LinkedIn’s data and enhanced through other sources.</p>
<blockquote>
<p><strong>Note:</strong> Proxycurl has since been sunset. I’m the founder behind Proxycurl, and the company I’m building now is <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a>, which focuses on publicly sourced B2B intelligence and does <strong>not</strong> scrape LinkedIn. I’m leaving the original Proxycurl workflow in this article in place because the implementation pattern is still useful if you’re evaluating a LinkedIn job scraping API or maintaining an older integration.</p>
</blockquote>
<p>We dealt with all of the headaches involved with scraping LinkedIn, like proxies, CAPTCHA solving, and so on, and delivered the B2B data in a convenient and easy to use format, an API.</p>
<p>By the way, if you’re wondering if this is legal, we only worked with publicly available data. <a href="[https://nubela.co/blog/is-linkedin](https://nubela.co/blog/is-linkedin)-scraping-legal/">US law and past court cases have cemented the legality of publicly scraping LinkedIn</a>.</p>
<h1 id="why-create-yet-another-job-board">Why create yet another job board?</h1>
<p>If you’re curious why everyone’s been creating a job board recently, like the answer to the reason why most businesses are created: it’s profitability.</p>
<p>Staffing/recruiting is a profitable business. Most businesses are constantly recruiting new talent. Especially unique individualized talent that’s not easy to find.</p>
<p>That said, the monetization strategy for job boards tends to vary.</p>
<p>Some of these sites operate a pay to post strategy for example, but for the most part the main monetization strategy of these job boards is simply data harvesting.</p>
<p><img alt="We Work Remotely's homepage" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/W3uXqCR24S.png" /></p>
<p>We Work Remotely's monetization strategy ($299 job posts)</p>
<p>You’ll find they often have you essentially fill out an application on the job board website, and then redirect you to the actual job. Or at least collect some basic information and your email address.</p>
<p>This is because they can then go and sell your unique relevant information to applicable companies to recruit you, or proceed to follow up and try to gain a recruitment commission.</p>
<p>Alrighty, now that we’ve covered the basics, let’s dive into actually building a job board:</p>
<h1 id="who-is-your-job-board-targeting">Who is your job board targeting?</h1>
<p>The first step to building a job board is picking out a specific niche.</p>
<p>I recommend something more specific than just “remote jobs” for instance, and also just “software development” job boards do seem a bit saturated now.</p>
<p>How can you further differentiate your job board from your competitors and make it a job board that’s genuinely valuable and helpful for a specific target audience?</p>
<p>Rather than just being a “software development” job board, take it down another level. So for example: you could be a Python only data analytics job board. Obviously this is just an example, but you get the point. Pick a job board that’s unique from the broad job boards already existing.</p>
<p>This carries two major benefits:</p>
<ol>
<li>By specifying your job board, you stand out and it’s easier to attract talent rather than trying to compete with broad and established job boards</li>
<li>If you make your job board known as a source of individualized talent, you can make strong relationships with relative companies that need the kind of talent coming to your job board.</li>
</ol>
<p>Companies will line up to give you tons of money if you can <a href="https://nubela.co/blog/the-definitive-guide-to-executive-searches-automatically-find-qualified-candidates/">find talented staff</a> that know what they're doing and have the skills to actually move the needle.</p>
<p>So before proceeding with this article, take a second to think: What’s a unique angle that isn’t overly saturated and is in demand by businesses <em>with money</em>?</p>
<p>The “with money” part is often why “software development” is such a frequently targeted job board audience. SaaS companies and the type of companies that need these skilled employees are often lined with more cash than someone like an eCommerce business looking for a customer support representative, for example.</p>
<h1 id="building-a-job-board-with-proxycurl">Building a job board with Proxycurl</h1>
<p>Since this method skips actually scraping the <a href="https://nubela.co/proxycurl/jobs-api?ref=nubela.co">job posting data</a>, this is probably easier than you think.</p>
<p>The top-down overview of building a job board is very simple:</p>
<ol>
<li>Have a <a href="[https://nubela.co/blog/the-ultimate-guide-to-proxycurls-linkedin-jobs-api-with-sample-code/](https://nubela.co/blog/the-ultimate-guide-to-proxycurls-linkedin-jobs-api-with-sample-code/)">LinkedIn job scraper</a> pulling data from LinkedIn, in this tutorial we will use Proxycurl</li>
<li>Display the data pulled from LinkedIn on your job board</li>
<li>Have a monetization strategy in place, again, this usually revolves around working with relative companies to gain recruitment commissions, etc.</li>
</ol>
<p>The primary API endpoint that’s going to be the most relevant here is our <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#jobs-api-job-search-endpoint">Job Search Endpoint</a>, this will allow you to specify identifying job characteristics and then get the LinkedIn job posting results returned back to you.</p>
<p>We’ll also be using Python to assist us with this, but you can use any programming language of your choice.</p>
<p>Let's dive in:</p>
<h2 id="step-1-setting-up-your-development-environment">Step 1) Setting up your development environment</h2>
<p>The first thing you’ll need is Python installed on your machine, I use <a href="https://www.jetbrains.com/pycharm/?ref=nubela.co">PyCharm</a> as my IDE. Then you’ll also need a web framework for Python.</p>
<p>In this case, we’ll use Flask which you can install with the following pip command:</p>
<pre><code class="language-bash">pip install flask
</code></pre>
<h2 id="step-2-create-a-basic-flask-application">Step 2) Create a basic Flask application</h2>
<p>Next you’ll create a new Python file for your Flask app, for example <code>app.py</code> and setup a basic Flask application:</p>
<pre><code class="language-python">from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)
</code></pre>
<h2 id="step-3-create-the-main-page-to-your-job-board">Step 3) Create the main page to your job board</h2>
<p>Create a folder named <code>templates</code> in the same directory as <code>app.py</code>. Inside that folder, create an HTML file named <code>index.html</code>, this will serve as the main page of your job board.</p>
<p>A simple <code>index.html</code> could look like this:</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Data Analyst Job Board&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Data Analyst Job Listings&lt;/h1&gt;
    &lt;div id=&quot;jobs&quot;&gt;
        &lt;!-- Job listings will go here --&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h2 id="step-4-integrating-proxycurls-api">Step 4) Integrating Proxycurl’s API</h2>
<p>Now let’s integrate Proxycurl’s API with our Flask application. Keep in mind you’ll need to replace <code>Your_API_Key</code> with your actual Proxycurl API key. Again, we are indeed using the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#jobs-api-job-search-endpoint">Job Search Endpoint</a> here.</p>
<p>That said, let’s say we wanted to create a job board specifically for “data analysts”, by modifying <code>app.py</code>, we could accomplish this:</p>
<pre><code class="language-python">import requests
from flask import Flask, render_template, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/api/jobs')
def get_jobs():
    api_key = 'Your_API_Key'
    headers = {'Authorization': 'Bearer ' + api_key}
    api_endpoint = 'https://nubela.co/proxycurl/api/v2/linkedin/company/job'
    params = {
        'keyword': 'data analyst',
    }

    response = requests.get(api_endpoint, params=params, headers=headers)
    print('API Response:', response.json())

    if response.status_code == 200:
        return jsonify(response.json())
    else:
        return jsonify({'error': 'Failed to fetch jobs'})

if __name__ == '__main__':
    app.run(debug=True)
</code></pre>
<p>The key part of this script that's specifying the type of jobs it's searching for is this part right here:</p>
<pre><code class="language-python">'keyword': 'data analyst',
</code></pre>
<p>There are all different ways of customizing this script, but the first thing you're going to want to modify is that part right there.</p>
<p><a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-job-search-endpoint">You can learn more about targeting with our Job Search Endpoint here</a>.</p>
<h2 id="step-5-fetch-and-display-jobs-in-the-frontend">Step 5) Fetch and display jobs in the frontend</h2>
<p>We need to use some JavaScript to fetch the job data from the Job Search Endpoint and display it on the page. This can be done using AJAX.</p>
<p>Go ahead and add the following script to <code>index.html</code> like so:</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Data Analyst Job Board&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Data Analyst Job Listings&lt;/h1&gt;
    &lt;div id=&quot;jobs&quot;&gt;
        &lt;!-- Job listings will be added here --&gt;
    &lt;/div&gt;
    &lt;script&gt;
        document.addEventListener('DOMContentLoaded', function() {
            fetch('/api/jobs')
                .then(response =&gt; response.json())
                .then(data =&gt; {
                    const jobsContainer = document.getElementById('jobs');
                    data.job.forEach(job =&gt; {
                        const jobElement = document.createElement('div');
                        jobElement.innerHTML = `
                            &lt;h2&gt;${job.job_title}&lt;/h2&gt;
                            &lt;p&gt;Company: ${job.company}&lt;/p&gt;
                            &lt;p&gt;Location: ${job.location}&lt;/p&gt;
                            &lt;p&gt;Listed on: ${job.list_date}&lt;/p&gt;
                            &lt;a href=&quot;${job.job_url}&quot; target=&quot;_blank&quot;&gt;View Job&lt;/a&gt;
                        `;
                        jobsContainer.appendChild(jobElement);
                    });
                })
                .catch(error =&gt; console.error('Error:', error));
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h2 id="step-6-start-your-job-board">Step 6) Start your job board</h2>
<p>Now we can go ahead and run our Flask application. You can click run if your using PyCharm, or execute the following command:</p>
<pre><code class="language-bash">python app.py
</code></pre>
<p><img alt="Starting Flask in PyCharm" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/pycharm64_DqYUFuYYhd.png" /></p>
<p>Starting Flask in PyCharm</p>
<p>Your job board is now live! Go ahead and visit <code>http://localhost:5000</code> in your browser to see your job board:</p>
<p><img alt="What our (ugly) job board looks like" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/chrome_zB1fssgrzB.png" /></p>
<p>What our (ugly) job board looks like</p>
<p>Definitely ugly, but you can edit the index according to your liking. The important part is that all of the functionality you need to create a job board is there.</p>
<p>By the way, if you go to <code>http://localhost:5000/api/jobs</code> you can see the raw API response:</p>
<p><img alt="API response seen from our job board" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/LzPJ5Ah7r5.png" /></p>
<p>API response seen from our job board</p>
<h2 id="step-7-customize-to-your-liking">Step 7) Customize to your liking</h2>
<p>You now have a way to <a href="https://nubela.co/proxycurl/jobs-api?ref=nubela.co">pull recent job postings at scale</a>. You simply need to further edit the above script to your liking, and work on bringing your job board to life, as well as adding a monetization strategy, but that usually comes later on.</p>
<p>There are many different options for hosting your Python website, but one of the easiest and most frequently used ones would be <a href="https://dashboard.heroku.com/?ref=nubela.co">Heroku</a>.</p>
<p>All you need to do is put your code within a GitHub repository, sync it, and specify that the code inside is in fact Python:</p>
<p><img alt="Running Python on a Heroku application" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/chrome_B5zW3mUelI.png" /></p>
<p>Running Python on a Heroku application</p>
<p>Then you’re good to go and can deploy your GitHub code onto a live Heroku Python application:</p>
<p><img alt="Deploying Python code live on Heroku" src="https://accountgram-production.sfo2.cdn.digitaloceanspaces.com/nubelaco_ghost/2023/11/chrome_MMFm9VH6Ld.png" /></p>
<p>Deploying Python code live on Heroku</p>
<h1 id="how-much-does-it-cost-to-create-a-job-board-with-proxycurl">How much does it cost to create a job board with Proxycurl?</h1>
<p>The actual hosting of your application is one thing, but in terms of our end, the <a href="https://nubela.co/proxycurl/docs?ref=nubela.co#search-api-job-search-endpoint">Job Search Endpoint</a>, it costs 2 credits per successful job post returned.</p>
<p>You see: <a href="https://nubela.co/proxycurl/pricing?ref=nubela.co">our API costs credits</a>. Every endpoint will have its own respective credit usage cost.</p>
<p>We also had both pay-as-you-go plans which would allow you to buy 100 credits for $10 for instance, or subscription plans that would allow you to get substantially more credits for the same price.</p>
<p>So that meant with the pay-as-you-go plans, the most expensive, every job post you’d pull would cost you $0.20 cents. Not bad.</p>
<p>Definitely leaves enough meat on the bone for you to be able to make some more on top.</p>
<h1 id="create-your-account">Create your account</h1>
<p>You've now seen the simplicity and power of building a specialized job board with a LinkedIn job scraping API.</p>
<p>With the basics in place and your unique niche identified, you're well on your way to creating a platform that connects talented professionals with the right opportunities.</p>
<p>If you're maintaining an older Proxycurl integration, the implementation above should still show you the moving pieces clearly. If you're here because you follow my work now, take a look at <a href="https://nubela.co/?ref=nubela.co">NinjaPear</a> instead. It is the company I’m building after Proxycurl, focused on publicly sourced B2B intelligence APIs rather than LinkedIn scraping.</p>
<p><strong>P.S.</strong> Have any questions? No problem, we have answers. Just reach out to us at "<a href="mailto:hello@nubela.co">hello@nubela.co</a>" and we'll get you taken care of ASAP!</p>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>

</channel>
</rss>