Prospect enrichment with Veezee
Turn identifiers you already have (LinkedIn profile URLs, slugs, or names) into current role, company, and experience data. LinkedIn only; this skill covers no other platform.
Setup (one free key, no signup)
Every call needs an API key. Minting one is free and human-free: no signup, no card. A call without a key fails with KEY_REQUIRED (401) carrying mint_url; the fix is the free mint below, never a payment. A fresh vz_trial_ key runs under a free per-IP daily budget of 200 credits, cached data only, first page only on any cursor sequence. Two equivalent surfaces; pick whichever your environment has:
- MCP: add the server
https://mcp.veezee.io/linkedin(streamable-http;https://mcp.veezee.io/allexposes every tool). Hosts that support MCP authorization (Claude Code, claude.ai) open a Veezee sign-in on connect (email code, no password): that is the whole auth step. Other hosts: mint a key withPOST https://api.veezee.io/v1/keys/mint(empty body; the key is shown once) and put it in the connection'sAuthorization: Bearerheader. - SDK:
import { VeezeeClient } from "@veezee/sdk";const client = new VeezeeClient(); await client.mint();mints and stores the free key the first time and reuses it on later runs. Platform methods live on the namespace (client.linkedin.getProfile/searchPeople/getCompany/getPosts);client.resolveUrlandclient.getUsageare top-level. The client sends retries and Idempotency-Keys for you. TheveezeeCLI (npx @veezee/sdk init) mints and stores the same key.
When the free budget or a trial cap runs out (TRIAL_CAP_EXCEEDED, INSUFFICIENT_CREDITS, BUDGET_EXHAUSTED), the error carries upgrade_url (https://veezee.io/upgrade) and a machine-readable offer. Hand that link to your human; purchases credit the same key directly and it keeps working unchanged.
The loop, per prospect
- Classify the identifier.
- Clean profile URL, slug (the part after
/in/), or URN: go straight to step 2. Do not callresolve_urlon clean identifiers; it costs credits for nothing. - Dirty or ambiguous URL (trackers, redirects, shortened):
resolve_urlfirst, then use the returned handle. - Name only:
search_peoplewithkeywords(andcurrent_companyif known), then take the best match.
- Clean profile URL, slug (the part after
get_profilewithsections: ["experience"]. The first two sections are included in the base price; each section beyond two costs extra, four sections maximum.- Record
full_name,headline,current_position, and the experience entries. Every response carriesusagewith the exact credits charged.
Rules that save credits and errors
- A
search_peopleresult withis_anonymous: trueis a private profile.get_profilecannot dereference it. Treat the match as confirmed and move on; never retry. - Check the budget BEFORE a batch:
get_usageis free, exempt from the rate limit, and works the same on a trial or paid key. - Set
max_creditson calls when running a large batch; a call whose quote exceeds it is rejected with nothing charged. - Default freshness is cached (usually a few hours old) and free.
freshness: "realtime"costs extra and needs a paid key (trial keys are cached-only and reject realtime with TRIAL_CAP_EXCEEDED); use it only when the user needs today's data. - A company known only by its website?
get_companyaccepts the domain directly (a new domain quotes extra for verified resolution; known domains settle at the base price). - On KEY_REQUIRED, mint the free key and retry the same call; it is never a payment problem. On TRIAL_CAP_EXCEEDED, INSUFFICIENT_CREDITS, or BUDGET_EXHAUSTED, stop the batch and give the error's
upgrade_urlto your human; purchases credit the account directly and the same key keeps working afterward. - A 403 NOT_ENTITLED means the key's account is not enabled for this platform; grants are explicit, write to hello@veezee.io to enable more.
Output
Report per prospect: name, current title, current company, and the two most recent experience entries. Include total credits spent (sum the usage.credits_charged fields) so the human can budget the next batch.
