Veezee

by veezeehq

Not rated
GitHub

About

LinkedIn, Reddit, and X data for AI agents

Details

Author
veezeehq
Categories
Search, Knowledge Base, Other

Setup

Install Veezee in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/veezeehq/veezee-sdk

Follow the installation instructions in the repository README, then restart your MCP client.

Typed REST client and CLI for theVeezee API: LinkedIn, Reddit, and X (formerly Twitter) data for AI agents, metered in credits with per-call receipts. Zero runtime dependencies, built on Node 20's globalfetch. Current version: 0.6.1.

The key spends; signing in adds a management token for key management.vz initmints a key with no signup: that key alone is enough to call every data endpoint.vz loginis a separate, optional step that proves an email and stores avzm_management token for listing, creating, revoking, and rotating keys, and for setting a low-balance alert. The first sign-in that confirms an email claimed on a trial key also adds a one-time 10,000-credit grant (once per email, once per key), spent after the free daily budget.

vz init(same command, shorter once installed) POSTs to/v1/keys/mintwith no signup and no card, and writes the returned key to~/.veezee/config(mode 0600). It never prints the raw key, only a masked hint: the key lives in a file and an env var, not in your terminal history or an agent's chat transcript. After that, everyvzcommand and every SDK call in the same environment just works:

import { VeezeeClient } from "@veezee/sdk"; const client = new VeezeeClient(); await client.mint(); // reuses the key from vz init, or mints one the first time const profile = await client.linkedin.getProfile({ identifier: "williamhgates" }); console.log(profile.common.full_name, profile.common.headline);

mint()is idempotent: it reusesVEEZEE_API_KEYor~/.veezee/configif either already has a key, and only mints a new one when neither does. The trial key itself carries no balance; the free tier is a per-IP, per-day allowance (200 credits/day, recent data, first page only) checked against the calling IP, not the key. Claiming the key adds a free balance on top: attach an email, confirm it by signing in atveezee.io/login, and the account gets a one-time 10,000-credit grant (once per email, once per key) that spends at the same trial limits after each day's free allowance is used. Outgrow both and a call fails withTRIAL_CAP_EXCEEDEDcarryingupgrade_url: buy credits atveezee.io/upgrade(no login required) and they land on the same key you already have. Nothing to reconfigure: same key, same config file, same code, now with a real balance.

You can skipvz initand pass a key directly instead:

const client = new VeezeeClient({ apiKey: process.env.VEEZEE_API_KEY });

Every call sendsAuthorization: Bearer <apiKey>. A call with no resolvable key throwsVeezeeErrorwithcode: "KEY_REQUIRED"and amint_url: POST there (no auth, no body) to mint a key, or just runvz initor callclient.mint(), then retry.get_usagealways needs a key too.

Platform tools live underclient.linkedin,client.reddit, andclient.x; account/billing tools (platform-independent) are top-level:

await client.linkedin.getProfile({ identifier: "williamhgates", sections: ["experience", "education"] }); // -> PersonEnvelope { common: { full_name, headline, experience, ... } } await client.linkedin.searchPeople({ keywords: "CTO", current_company: "anthropic", limit: 20 }); // -> PeopleSearchEnvelope { common: { results, cursor, total_matches } } await client.linkedin.getCompany({ identifier: "microsoft" }); // -> CompanyEnvelope { common: { name, industry, employee_count, ... } } await client.linkedin.getPosts({ identifier: "microsoft" }); // -> PostsEnvelope { common: { results, cursor, author_type } } await client.reddit.search({ query: "notion alternative", type: "comments" }); // -> RedditSearchEnvelope { common: { type: "comments", comments, cursor, returned_count } } await client.reddit.getSubredditPosts({ subreddit_name: "selfhosted", sort: "new" }); // -> RedditPostsEnvelope { common: { results, cursor, returned_count } } await client.x.getProfile({ identifier: "nasa" }); // -> XProfileEnvelope { common: { screen_name, name, followers, description, ... } } await client.x.search({ query: "veezee api", type: "recent" }); // -> XSearchEnvelope { common: { type: "recent", tweets, cursor, returned_count } } await client.resolveUrl({ url: "https://www.linkedin.com/in/williamhgates" }); // -> UrlResolutionEnvelope { common: { type: "person", id, handle, canonical_url } } // client.reddit.resolveUrl and client.x.resolveUrl work the same way for their own URLs. await client.getUsage(); // -> UsageEnvelope { common: { plan, platforms, balance_remaining, recent_receipts, upgrade_url, manage_url } } await client.checkout({ pack: "flex" | "production" }); // -> { checkout_url }. Needs no key: paying with none mints a fresh account and its key.

Every response is anenvelope:{ entity, platform, canonical_url, data_as_of, schema_version, common, platform_fields, freshness, usage }.usage.credits_chargedandusage.receipt_idare on every call;freshnesstells you how old the data is. Free-tier trial-key calls also carryusage.free_tier_hint, explaining what budget the call drew from and that paying upgrades this same key.

Non-2xx responses throw a typedVeezeeError(extendsError) carrying the API's problem+json body:

import { VeezeeError } from "@veezee/sdk"; try { await client.linkedin.getProfile({ identifier: "someone" }); } catch (err) { if (err instanceof VeezeeError) { console.error(err.code, err.message); // message is a next-turn instruction if (err.is_retriable) { // safe to retry as-is; the client already retried transient errors internally } } }

The client retriesRATE_LIMITED,CONCURRENCY_LIMIT,UPSTREAM_UNAVAILABLE,INTERNAL, and network/timeout failures up to 3 attempts with exponential backoff, honoringretry_after_secondswhen present. Every metered call gets oneIdempotency-Key(UUID), reused across its own retries: retries never double-charge. Terminal errors (bad input, insufficient credits, auth) throw immediately without retrying.

Errors a payment can fix also carryupgrade_url(give it to your human),credits_required(onINSUFFICIENT_CREDITS: the credits the call needed), andoffer(typedOfferV1): pack prices,checkout_url(the same link asupgrade_url), andresume, which says exactly how to retry after payment.

A call made with no resolvable key throwscode: "KEY_REQUIRED"carryingmint_url: runvz initor callclient.mint(), then retry. A management call (listKeys,createKey,revokeKey,rotateKey,setBalanceAlert) made with no resolvable management token throwscode: "AUTH_REQUIRED": runvz login, then retry.

The package ships aveezeebin, withvzas a short alias for the same binary (noun-verb, mirrors the methods above):

veezee init [--force] veezee linkedin profile get <identifier> [--sections a,b] [--realtime] veezee linkedin search [--keywords x] [--title x] [--company x] [--past-company x] [--school x] [--first-name x] [--last-name x] [--limit n] [--cursor x] [--freshness x] veezee linkedin company get <identifier> veezee linkedin posts get <identifier> veezee reddit search <query> [--type posts|comments|subreddits|users] [--sort x] [--range x] veezee reddit subreddit <name> [--include-settings] veezee reddit subreddit-posts <name> [--sort x] [--range x] [--include-promoted] veezee reddit user <username> [--sections comments,posts,subreddits] veezee reddit post <id1,id2,...> [--detail concise|full] [--comment-id x] veezee x search <query> [--type recent|popular|people] veezee x profile <identifier> [--by screen_name|id] veezee x tweets <identifier> [--mode posts|posts_and_replies|highlights] [--no-retweets] veezee x tweet <tweet_id> veezee resolve-url <url> veezee usage veezee login [--device] [--no-browser] veezee logout veezee keys list [--account <id>] veezee keys create [--label <name>] [--account <id>] veezee keys revoke <key_id> [--account <id>] veezee keys rotate <key_id> [--account <id>] veezee alert <threshold|off> [--account <id>]

Runvz initfirst (once): it mints a free trial key and writes it to~/.veezee/config, masked hint only ever printed to stdout, never the raw key.vz init --jsonprints the same result as JSON (still no raw key) for scripting.vz init --forcere-mints and overwrites the stored key.

For example,vz reddit search "notion alternative" --type commentsorvz x profile nasa. Every platform namespace also has its ownresolve-url:vz reddit resolve-url <url>,vz x resolve-url <url>.

Add--jsonon any command for machine-readable output (the raw envelope; errors print the full error shape as JSON too). Every data command takes--max-credits <n>to cap spend on that call: if the quote exceeds the cap the API returns a typed error and charges nothing. Unknown flags are rejected with the valid-flag list (exit 2), never silently ignored. Auth resolves in order:--key <apiKey>, then theVEEZEE_API_KEYenv var, then~/.veezee/configfromvz init.--base-urloverrides the API host. Exit codes:0success,1failure,2usage or invalid-input error,4auth required.vz --versionprints the SDK version. Runvz --help(or no args) for examples.

vz loginis a separate, optional step: it proves an email (browser callback by default, or--devicefor a headless code-entry flow) and stores avzm_management token in~/.veezee/config, masked hint only ever printed to stdout.vz keys list|create|revoke|rotateandvz alert <threshold|off>use that token, resolved in order:--key <vzm_...>, thenVEEZEE_MGMT_TOKEN, then the stored token.vz keys createandvz keys rotateprint the rawapi_keyto stdout once (the "shown once" warning goes to stderr): store it immediately, it cannot be retrieved again.vz logoutclears the locally stored token; it does not revoke it server-side.

The package ships eight installable SKILL.md packs underskills/: prospect-enrich, candidate-sourcing, company-enrichment, account-research, post-voice-research, reddit-monitoring, launch-sentiment-sweep, and outreach-list-builder. Afternpm install @veezee/sdk, add them to your agent with theskills CLIlocal-path syntax:

npx skills add ./node_modules/@veezee/sdk/skills

The same packs also install straight from GitHub (veezeehq/veezee-skills):npx skills add veezeehq/veezee-skills. Pack index and docs:veezee.io/docs/skills.

npm install npm run build # tsc -> dist/ npm test # compiles test/ and runs node --test npm pack --dry-run

CI should run exactly this sequence (npm ci && npm run build && npm test) on Node 20+; this package has no separate lint step and no network calls in its test suite.

Full API reference:https://veezee.io/docs. SDK page:https://veezee.io/docs/sdk. CLI page:https://veezee.io/docs/cli. Hosted MCP servers (same tools, no install):https://veezee.io/docs/clients, listed in theMCP Registryasio.veezee/linkedin,io.veezee/reddit, andio.veezee/x-twitter.

Search global news using natural language. Webz.io News Search API returns the most relevant articles and content, with filters for source, country, language, date, sentiment, and category.

Fetch, convert, and search AWS documentation pages, with recommendations for related content.

Search campgrounds around the world on campertunity, check availability, and provide booking links.

The Ferryhopper MCP Server exposes ferry routes, schedules and booking redirects so an AI assistant can discover connections across Europe and the Mediterranean and send users to Ferryhopper to complete bookings.

All-in-One SEO & Web Intelligence Toolkit API from FetchSERP.

MCP server that provides read-only access to HyperKitty, the web-based email archive component of Mailman 3.

At Sunrise Apps, we believe AI agents should be limitless, especially when it comes to visual data. We created ImageSorcery to bridge the critical gap in AI's ability to interact with and manipulate images directly, all while upholding the highest standards of privacy and security.

Just Domain is the domain registrar for businesses built with AI. Its remote MCP server checks availability and returns first-year and renewal pricing, plus a link to register on justdomain.ai, with DNS and WHOIS privacy in the same place. No account, no API key, read only. Endpoint: https://mcp.justdomain.ai/

Research tools, including a Sqlite-backed document stash

Semantic search over 9 free-license stock photo sources. Hosted remote server with OAuth — no API key to paste.

SerpApi MCP Server for Google and other search engine results

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.