Migrating from Proxycurl to Veezee
Background
Proxycurl shut down its LinkedIn API in July 2025 to comply with a legal settlement, after LinkedIn sued its operator in January 2025 (announcement: nubela.co/blog/goodbye-proxycurl/; docket: LinkedIn Corp. v. Nubela Pte. Ltd., 3:25-cv-00828, N.D. Cal.). Production integrations built on it need a replacement. This guide maps each historical Proxycurl endpoint to the closest Veezee equivalent and says plainly where none exists. Proxycurl route details come from the archived public docs (web.archive.org snapshot of nubela.co/proxycurl/docs, June 2025) and the official public Postman collection; nothing here is guessed.
Veezee is an agent-first LinkedIn data API: seven tools over MCP (https://mcp.veezee.io/mcp) and REST (https://api.veezee.io, contract at /openapi.json), credit-priced, with a free 500 credits trial via one provision call and no signup.
Endpoint map
| Proxycurl (historical) | Veezee | Migration notes |
|---|---|---|
Person Profile GET /api/v2/linkedin | get_profile GET /v1/profiles | Proxycurl took linkedin_profile_url plus include/exclude extras. Veezee takes identifier (URL, slug, or URN) and sections (about, experience, education, skills). Response fields are not drop-in compatible; plan a mapping pass. |
Company Profile GET /api/linkedin/company | get_company GET /v1/companies | identifier accepts a company URL, slug, numeric id, or website domain. |
Company Lookup GET /api/linkedin/company/resolve | get_company with the domain | Pass the website domain as identifier; Veezee resolves it and verifies the result against the company's own website. The first lookup of a new domain adds 4 credits; known domains settle at the base price. An unverifiable domain returns INVALID_INPUT with the closest matches, never a guessed company. |
Person Search GET /api/v2/search/person/ | search_people GET /v1/people | Proxycurl used Boolean query-string filters. Veezee uses typed params: keywords, first_name, last_name, title, school, current_company, past_company. Matching behavior differs; re-test your queries. |
Company Search GET /api/v2/search/company | no standalone equivalent | Veezee has no company-search tool in v1. With a domain in hand use get_company directly; inside people searches the company filters accept plain names and resolve internally. |
Employee Listing GET /api/linkedin/company/employees/ | search_people with current_company | A search, not an exhaustive roster; enrich selected results with get_profile. |
Employee Search GET /api/linkedin/company/employee/search/ | search_people | Replace keyword_regex/country with title and keyword filters; regex matching is not supported. |
Person Lookup GET /api/linkedin/profile/resolve | search_people, then get_profile | No one-result resolver; search, pick the right hit, enrich it. |
Role Lookup GET /api/find/company/role/ | search_people with title + current_company | Proxycurl returned a single closest match; Veezee returns candidates for you to pick from. |
Employee Count GET /api/linkedin/company/employees/count | get_company employee_count field | No current/past split and no historical at_date query. |
Person posts (served as activities/articles fields of the profile response; no standalone endpoint existed) | get_posts GET /v1/posts | One dedicated tool for person or company posts, cursor-paginated. |
Company updates field of the company response | get_posts with the company identifier | |
Credit Balance GET /api/credit-balance | get_usage GET /v1/usage | Free and exempt from the per-minute rate limit. |
| Contact API (personal email, work email, phone, reverse email, reverse phone, disposable-email check) | none | Veezee serves no contact-detail lookups, and get_profile does not return emails or phone numbers. |
| Jobs API, School API, student listings, profile-picture endpoints | none | Outside Veezee's v1 scope. |
What you must rework, honestly
- Contact data (emails, phone numbers) has no Veezee replacement; if you need it, integrate a separate purpose-built service.
- Exhaustive employee rosters and historical headcounts are not served.
- Response schemas differ everywhere; treat /openapi.json as the source of truth and budget one mapping pass per endpoint.
- Every metered REST call needs an
Idempotency-Keyheader, GET included. Reuse the same key only to retry the identical call.
Five-minute start
Provision a trial key (no signup, no card, 500 credits free):
curl -X POST https://api.veezee.io/v1/provision
Store the returned api_key (shown exactly once), then make one enriched profile call:
curl "https://api.veezee.io/v1/profiles?identifier=williamhgates§ions=experience,education" \
-H "Authorization: Bearer $VEEZEE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
identifier also accepts a full LinkedIn URL. Check spend anytime with GET /v1/usage (free). Before provisioning at all, a keyless taste of 20 credits per IP per day serves cached data with no key and no Idempotency-Key.
Pricing model
Both products price in credits, but the units are unrelated; never convert a balance one to one. Proxycurl varied cost by endpoint, results returned, and optional enrichment flags (archived docs). Veezee prices per call: 4 credits per profile (each section beyond the included two adds 2 credits), 10 credits per search page, 4 credits per company (4 credits more on the first lookup of a new domain), 4 credits per posts page, 2 credits per URL resolution. Realtime fetches add 2 credits, refunded automatically on cached fallback. Full table and worked examples: /pricing.
Sources
- Shutdown announcement: nubela.co/blog/goodbye-proxycurl/ (2025-07-04)
- Lawsuit docket: LinkedIn Corporation v. Nubela Pte. Ltd. et al, 3:25-cv-00828, N.D. Cal., filed 2025-01-24
- Archived Proxycurl API docs: web.archive.org/web/20250601194455/https://nubela.co/proxycurl/docs
- Archived Search API page: web.archive.org/web/20250706022442/https://nubela.co/proxycurl/search-api.html
- Official Postman collection: postman.com/proxycurl-team/proxycurl/documentation/mwz67fs/proxycurl