Nubela / NinjaPear

The Proxycurl team's second act: a B2B person and company data API that deliberately holds no LinkedIn data.

Nubela is a Singapore software company founded in 2014 by Steven Goh. It built Proxycurl, the LinkedIn data API that a lot of sales tooling quietly ran on, grew it to roughly $10M ARR without funding, then lost it to a LinkedIn lawsuit in 2025. NinjaPear is what the same team ships now: a B2B person and company data API built on public web sources, with LinkedIn deliberately excluded. Same engineering, opposite risk profile.

NinjaPear brand banner: a purple ninja pear mascot next to the tagline Competitive Intelligence Data, mapping customers, products and competitors

Why Proxycurl died

Worth knowing before you build on anything from this team, because it explains every design decision in the new product.

  • Jan 2016: Proxycurl starts as a scraping-infrastructure product.
  • 2020: the Professional Social Network API launches. It becomes Nubela's revenue engine.
  • 24 Jan 2025: LinkedIn files suit in the Northern District of California (Case No. 3:25-cv-00828), naming Nubela and Goh personally. Six claims: breach of contract, fraud, Computer Fraud and Abuse Act, California Unfair Competition Law, trademark dilution, misappropriation. The core allegation is hundreds of thousands of fake accounts used to scrape member data at scale.
  • 4 Jul 2025: Proxycurl shuts down. Goh settles and does not disclose terms.

His public reasoning is worth repeating: under the American Rule you cannot recover legal fees even when you win, so a bootstrapped company facing a Microsoft subsidiary loses on cost alone. His stated regret is not the scraping, it is staying small. Size buys legal cover.

His advice now: do not build a company on LinkedIn data.

For business people

NinjaPear answers two questions at scale: who is this person and what is going on at this company. You feed it a company website or a person's name plus a domain, and you get back structured records instead of a browser tab.

Where it earns its place:

  • Account research before a call. Company details, headcount and growth, funding history, recent blog posts, tweets and YouTube uploads, all in one call.
  • Competitive mapping. The Competitor and Customer endpoints return who a company sells to and who it loses to, with a stated reason per competitor. That is the part generic enrichment vendors do not have.
  • Contact enrichment. Person profile plus verified work email lookup, priced so a miss costs almost nothing.
  • Monitoring. Feeds that watch a set of target companies and surface changes.

Three ways in: the REST API, an MCP server you point Claude at, or Prospector, a spreadsheet-style dashboard for people who do not want to write code.

Cost shape. Credits, not seats. A 3-day trial gives 10 credits with no card. Pay-as-you-go starts at a $10 pack (30-day expiry; bigger packs get 90 days, and a new purchase extends unexpired credits). Subscriptions run $49, $299, $899 and $1,899 per month, and mainly buy you rate limit headroom rather than a different dataset.

The honest limitation. No LinkedIn data means gaps. Job history and titles come from company sites, press, filings and open directories, so coverage is strongest for companies with a real web presence and weakest for individuals at small or private firms. That is the trade you are making: less depth on people, no legal exposure. For account-level intelligence the trade is good. For pure people-search volume, it is a step down from what Proxycurl did.

For technical people

Plain REST, JSON, bearer auth. Nothing exotic.

Base URL:  https://nubela.co/api
Auth:      Authorization: Bearer YOUR_API_KEY

Endpoints

Endpoint Path Returns
Company Details GET /v1/company/details Metadata, leadership, financials
Employee Count GET /v1/company/employee-count Estimated headcount
Company Funding GET /v1/company/funding Rounds and investors
Company Updates GET /v1/company/updates Blog posts, tweets, YouTube
Website Lookup GET /v1/company/website Name to canonical domain
Company Logo GET /v1/company/logo 128x128 PNG (free)
Customer Listing GET /v1/customer/listing Customers, investors, partners
Competitor Listing GET /v1/competitor/listing Competitors plus reason
Product Listing GET /v1/product/listing Products, pricing, integrations
Person Profile GET /v2/employee/profile Job history, education, socials
Work Email GET /v1/employee/work-email Email from name plus domain
Similar People GET /v1/employee/similar Peers at competitor firms
Disposable Email GET /v1/employee/disposable-email-checker Throwaway/free check (free)
Credit Balance GET /v1/credits Remaining credits (free)

The canonical identifier is the company website, not a profile URL. That is the structural fix after Proxycurl: nothing in the schema points back at LinkedIn.

Credit costs

Call Cost
Person Profile 3 credits
Company Details 3 credits (up to 6 with flags)
Company Funding 2 credits + 1 per investor
Company Updates 2 credits
Customer Listing 1 credit + 2 per customer
Competitor Listing 5 credits minimum + 2 per competitor
Employee Search 2 credits + 1 per employee
Work Email 2 credits on a hit, 0.5 on a miss

Billing details that matter when you loop: failed requests are never charged, the minimum is 0.1 credits per successful call, cached records inside their freshness window cost 0, and every response carries X-NinjaPear-Credit-Cost. So a re-run of yesterday's batch is close to free.

⚠️ WARNING: Company Funding and Similar People are long-running, with a 300-second read timeout. Everything else is 100 seconds. Set your client timeout accordingly or you will kill calls you already paid for.

Rate limits

Paid endpoints sit at 50 requests/minute regardless of plan. Only the free endpoints scale with the tier: 2/min on trial and PAYG, then 20, 50, 100 and 300/min up the ladder. A 429 returns Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.

Install

uv add ninjapear     # or: pip install ninjapear
npm install ninjapear
import os
from ninjapear import NinjaPearClient

np = NinjaPearClient(api_key=os.environ["NINJAPEAR_KEY"])
company = np.company.details(website="kaltura.com")

They publish an OpenAPI 3.0 spec at nubela.co/api/openapi3.yaml and LLM-readable docs at nubela.co/llms-full.txt, so a coding agent can wire it up without you pasting the reference in.

MCP and Claude

The part I actually care about. NinjaPear ships a remote MCP server, so Claude can pull live company data mid-conversation.

Add it as a custom connector in Claude settings with your key inline:

https://nubela.co/mcp/sse?api_key=YOUR_API_KEY

Exposed tools cover get_company_details, get_customer_listing, get_employee_count, disposable email validation, and feed management (create_feed, add_target, consume_feed) for competitor monitoring. In Excel and PowerPoint the same data comes through the =CLAUDE() formula.

For coding agents there is an installable skill that teaches correct API usage:

npx skills add NinjaPear/ninjapear-skill -a claude-code

Works with Claude Code, Codex and Opencode. Add -g to install globally.

Alternatives

Provider Strength Watch out for
Apollo.io Contact volume plus sequencing in one tool Data decay on smaller accounts
People Data Labs Large person dataset, licensing-first Priced for volume, not for occasional lookups
Coresignal Firmographic and headcount time series Heavier integration lift

My take

The interesting thing here is not the API, it is the constraint. Losing $10M ARR to a terms-of-service fight forced a rebuild where the schema itself cannot depend on the thing that killed you. Whether the coverage holds up against Proxycurl is the open question, and the trial is 10 credits, so it costs nothing to find out.

For me the MCP server is the hook. Company details, customers and competitors pulled straight into Claude during account prep beats another tab and another CSV export.

Further reading