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.


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.