Vendo AI API & MCP
The complete programmable interface to the Vendo AI autonomous sales platform. Build integrations, connect AI assistants, and automate your entire sales pipeline.
The Vendo AI Public API turns Vendo AI from a UI-only product into a fully programmable platform. Generate an API key, and you can drive the entire product — create AI agents, build audiences, launch multi-channel campaigns, read analytics, and manage billing — all from your own code, Zapier/Make workflows, or directly through an AI assistant like Claude or ChatGPT via Model Context Protocol (MCP).
AI Agent Lifecycle
Create agents, scan websites, generate scripts, set avatars, configure connections — full onboarding pipeline via API.
Campaign Management
Create, launch, pause, resume, and archive multi-channel outreach campaigns with preview protection.
Audience Search
Search the people graph, save audiences, enrich contacts with verified email addresses.
Vendo SDR Automation
Manage signal hunters, monitor discovered personas, launch outreach, view signal intelligence in real time.
Billing & Analytics
Read credit balance, subscriptions, invoices, usage stats, funnel analytics — full read-only billing surface.
MCP for AI Assistants
Connect Claude, ChatGPT, or Cursor directly. 96 tools let an AI operate your account in plain English.
Quick Start
Get started in three steps:
1. Get your API key
Log in to app.vendo-ai.com, go to Settings → API & MCP, and click "Create my key". You'll need an active subscription or free trial. The key is shown once — copy it immediately.
2. Make your first request
curl -s https://api.vendo-ai.com/v1/billing/balance \ -H "Authorization: Bearer vnd_live_YOUR_KEY_HERE" | jq . # Response: { "data": { "balance": 450 } }
3. Or connect via MCP
Add the Vendo AI MCP server to Claude Desktop, ChatGPT, or any MCP-compatible client:
{
"mcpServers": {
"vendo-ai": {
"url": "https://api.vendo-ai.com/mcp",
"headers": {
"Authorization": "Bearer vnd_live_YOUR_KEY_HERE"
}
}
}
}
Base URL
https://api.vendo-ai.com — all API endpoints are under /v1/
https://api.vendo-ai.com/mcp — MCP Streamable HTTP transport
Authentication
API Key Format
Keys follow the pattern vnd_live_ + 64 hex characters (32 random bytes). Example:
vnd_live_8f3a27207c3dd1a49beed2a852275eb77892491daaa19541bb761300694a4d46 ^^^^^^^^^ prefix ← 32 random bytes → hex
Passing Your Key
Include your key in every request using either header:
Authorization: Bearer vnd_live_YOUR_KEY
# or
X-API-Key: vnd_live_YOUR_KEY
Security Model
- Hashed storage — only the SHA-256 hash is stored. The raw key is shown once at creation.
- Workspace-bound — every key belongs to exactly one workspace. Cross-tenant access is structurally impossible.
- Scope-enforced — each route requires specific scopes (all granted by default). See Scopes Reference.
- No billing:write — a leaked key cannot move money. Top-ups and plan changes require the authenticated portal.
- Instant revocation — delete a key in Settings, and it's invalid on the next request.
Architecture
The Public API is a dedicated microservice (vendo-public-api, port 3015) that sits in front of all internal Vendo AI services. It enforces authentication, scopes, rate limiting, audit logging, and billing pre-checks in one place. The MCP adapter (vendo-mcp, port 3016) is a thin translation layer that converts MCP tool calls into /v1 REST requests.
Workspace Isolation
Every API key is resolved to a single workspace_id on the first call — the gateway calls vendo-auth with a shared internal secret and caches the result on the key row. All downstream calls inject this workspace_id and refuse to honour any caller-supplied workspace id. Cross-tenant access is structurally impossible regardless of what the request body contains.
Why a Separate Microservice?
Stable contract — /v1/... is a promise. Internal services evolve freely behind it. One hardening surface for keys, rate limits, quota, and audit. Independent scaling from the UI traffic.
Rate Limits
Default rate limit is 60 requests per minute per API key (sliding window). Response headers tell you your current state:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window (default 60) |
X-RateLimit-Remaining | Remaining requests in current window |
Retry-After | Seconds until window resets (only sent on 429) |
X-Idempotency-Replay | true when an Idempotency-Key matched a cached response |
When you exceed the limit, the API returns 429 Too Many Requests with a Retry-After header.
Error Handling
All errors follow a consistent JSON structure:
{
"code": "missing_scope",
"message": "Required scope(s) not on key: agents:write"
}
| HTTP Code | Error Code | Meaning |
|---|---|---|
| 400 | bad_request | Invalid input or parameters |
| 400 | confirmation_required | Destructive action — send dry_run or confirm |
| 401 | unauthorized | Missing or invalid API key |
| 402 | no_credits | Insufficient credit balance |
| 403 | missing_scope | Key lacks the required scope |
| 404 | not_found | Resource doesn't exist or wrong workspace |
| 409 | idempotency_conflict | Idempotency-Key reused for a different request |
| 429 | rate_limited | Too many requests — check Retry-After header |
| 500 | downstream_error | Internal service error (retry safe) |
Agents
The Agents API provides complete lifecycle management — from creating an AI sales agent to scanning a website, generating a conversational script, setting an avatar, and configuring connections (Google Meet, Telegram, Website Widget, Presentations).
Core Endpoints
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/agents | agents:read | List all agents |
| GET | /v1/agents/with-stats | agents:read | List agents with connection + credit stats |
| GET | /v1/agents/:id | agents:read | Get agent details |
| GET | /v1/agents/plan-limits | agents:read | Plan capacity vs current agent count |
| GET | /v1/agents/dashboard/analytics | agents:read | Dashboard summary |
| POST | /v1/agents | agents:write | Create a new agent (1 credit) |
| PATCH | /v1/agents/:id | agents:write | Update agent info |
| DELETE | /v1/agents/:id | agents:write | Delete agent (requires confirm) |
| POST | /v1/agents/:id/deep-scan | agents:write | Deep-scan website — 15 credits, paired dry_run/confirm |
| POST | /v1/agents/:id/duplicate | agents:write | Clone an agent |
Agent Credits & Analytics
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/agents/:id/credits-spent | agents:read | Credits this agent has spent |
| GET | /v1/agents/:id/credits-spent/connections | agents:read | Per-connection credit breakdown |
| GET | /v1/agents/credits-spent | agents:read | Whole-workspace agent credit breakdown |
Agent Pipeline Endpoints
These endpoints power the full onboarding flow — from scanning a website to generating a sales script:
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/agents/scan | Quick website scan (no agent id needed yet) |
| POST | /v1/agents/:id/scan-website | Quick site scan attached to an agent |
| POST | /v1/agents/:id/deep-scan | Deep website scan — 15 credits, requires dry_run/confirm |
| POST | /v1/agents/:id/save-scan-data | Persist scan output onto the agent |
| POST | /v1/agents/:id/generate-description | Generate company description (1 credit) |
| POST | /v1/agents/:id/generate-script | Generate full sales script — 1 credit, 8-stage AI |
| POST | /v1/agents/:id/generate-support-script | Generate support script |
| POST | /v1/agents/:id/generate-narrator-script | Generate narrator script |
| POST | /v1/agents/:id/generate-transition-phrases | Slide transition narration |
| POST | /v1/agents/:id/generate-page-descriptions | AI page descriptions for an agent |
| POST | /v1/agents/page-descriptions | AI page descriptions without an agent |
| PATCH | /v1/agents/:id/company | Set / update company name + website + description |
| PATCH | /v1/agents/:id/avatar | Set avatar from URL (body: { "image_url": "https://..." }) |
| PATCH | /v1/agents/:id/script | Manually overwrite script |
| PATCH | /v1/agents/:id/voice | Update Retell voice settings |
| PATCH | /v1/agents/:id/integrations | Update CRM integration config |
| PATCH | /v1/agents/:id/status | ACTIVE / PAUSED / DRAFT / ARCHIVED |
| DELETE | /v1/agents/:id/documents | Delete an agent document (body: { "filename": "…" }) |
Connection Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/agents/:id/connections | List all connections |
| POST | /v1/agents/:id/connections | Create a connection (generic) |
| GET | /v1/agents/:id/connections/:cid | Get one connection |
| PATCH | /v1/agents/:id/connections/:cid | Update connection config |
| DELETE | /v1/agents/:id/connections/:cid | Disconnect |
| GET | /v1/agents/:id/connections/:cid/stats | Per-connection stats |
| GET | /v1/agents/:id/connections/:cid/conversations | Conversation history |
| GET | /v1/agents/:id/widget/embed-code | Embed code for the website widget |
| GET | /v1/agents/voices/retell | List available Retell voices |
| GET | /v1/agents/:id/google-meet/auth-url | Start Google Meet OAuth (returns URL) |
| GET | /v1/agents/:id/google-meet | Current Google Meet config |
| PATCH | /v1/agents/:id/google-meet/config | Update Google Meet config |
| DELETE | /v1/agents/:id/google-meet | Disconnect Google Meet |
| GET | /v1/agents/:id/google-meet/meetings | List meetings |
| POST | /v1/agents/:id/google-meet/sync | Force sync meetings |
| POST | /v1/agents/:id/telegram/connect | Connect Telegram bot (body: { "bot_token": "…" }) |
| DELETE | /v1/agents/:id/telegram | Disconnect Telegram bot |
| GET | /v1/agents/:id/telegram | Current bot info |
| PATCH | /v1/agents/:id/telegram/voice | Toggle voice (body: { "enabled": true/false }) |
| POST | /v1/agents/:id/telegram/reconfigure | Reconfigure bot settings |
| GET | /v1/agents/:id/telegram/analytics | Telegram analytics |
| GET | /v1/agents/:id/presentations | List presentations attached to this agent |
| GET | /v1/agents/:id/presentations/embed | Presentation embed code |
| GET | /v1/agents/:id/narrator/analytics | Narrator analytics |
| GET | /v1/agents/:id/narrator/leads | Leads captured by the agent's presentations |
| PATCH | /v1/agents/:id/narrator/leads/:leadId | Update / dismiss a narrator lead |
Preview Endpoints
Preview exactly what your agent would send before any campaign launch:
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/agents/:id/preview/email | Preview the email this agent would send |
| POST | /v1/agents/:id/preview/linkedin-invite | Preview the LinkedIn invite text |
| POST | /v1/agents/:id/preview/linkedin-followup | Preview the LinkedIn follow-up message |
Campaigns
Campaigns are multi-channel outreach sequences. You can create a campaign, attach an audience, configure channels (email, LinkedIn, calls), and launch it — all through the API.
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /v1/campaigns | campaigns:read | List all campaigns |
| GET | /v1/campaigns/:id | campaigns:read | Get campaign details + stats |
| POST | /v1/campaigns | campaigns:write | Create a campaign |
| PATCH | /v1/campaigns/:id | campaigns:write | Update campaign settings |
| DELETE | /v1/campaigns/:id | campaigns:write | Delete campaign (requires confirm) |
| POST | /v1/campaigns/:id/launch | campaigns:control | Launch campaign (requires confirm) |
| POST | /v1/campaigns/:id/pause | campaigns:control | Pause all channels |
| POST | /v1/campaigns/:id/pause-channel | campaigns:control | Pause a specific channel |
| POST | /v1/campaigns/:id/resume-channel | campaigns:control | Resume a specific channel |
| POST | /v1/campaigns/:id/archive | campaigns:control | Archive campaign |
Audiences
| Method | Endpoint | Scope | Description |
|---|---|---|---|
| POST | /v1/audiences/search | audiences:read | Search the people graph (preview, free) |
| POST | /v1/audiences | audiences:write | Save audience from search results |
curl -X POST https://api.vendo-ai.com/v1/audiences/search \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"positions": ["VP Sales", "Head of Revenue"],
"countries": ["United States"],
"companySizes": ["small", "medium"],
"industries": ["SaaS", "Technology"],
"mustHaveEmail": true,
"limit": 25
}'
Vendo SDR
The SDR (Signal-Driven Revenue) module gives you full control over the autonomous discovery pipeline — 9 AI hunters that continuously scan the web for buying signals, discover prospects, and launch outreach.
Signal Search Lifecycle
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/sdr/searches | List all signal searches |
| GET | /v1/sdr/searches/:id | Get search details |
| POST | /v1/sdr/searches | Create a Signal Search (hunters start immediately) |
| PATCH | /v1/sdr/searches/:id | Update search parameters |
| POST | /v1/sdr/searches/:id/activate | Activate a search |
| POST | /v1/sdr/searches/:id/pause | Pause a search |
| POST | /v1/sdr/searches/:id/resume | Resume a paused search |
| POST | /v1/sdr/searches/:id/regenerate | Regenerate search configuration |
| DELETE | /v1/sdr/searches/:id | Delete search (requires confirm) |
Agent Signal Profile
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/sdr/agents/:id/profile | Get the agent's current signal profile |
| POST | /v1/sdr/agents/:id/profile/generate | (Re-)generate the signal profile (Claude call) |
| POST | /v1/sdr/searches/preview | Preview Claude output before creating a search |
Personas & Signals
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/sdr/people?search_id=… | List discovered people (with filters: company, role, min_relevance, limit, offset) |
| GET | /v1/sdr/people/stats?search_id=… | Counts, top companies, by-role, credits spent, daily series |
| POST | /v1/sdr/people/export-to-audience | Export selected people to a custom audience |
| POST | /v1/sdr/people/backfill-avatars | Async backfill of LinkedIn avatars onto people rows |
SDR Outreach
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/sdr/searches/:id/outreach | Get outreach status for one Signal Search |
| POST | /v1/sdr/searches/:id/outreach/launch | Launch outreach — paired dry_run/confirm |
| GET | /v1/sdr/searches/:id/outreach/content | Read outreach templates |
| PATCH | /v1/sdr/searches/:id/outreach/content | Update outreach templates |
| POST | /v1/sdr/searches/:id/outreach/content/preview | Render a personalised message preview |
| POST | /v1/sdr/searches/:id/outreach/pause | Pause outreach delivery |
| POST | /v1/sdr/searches/:id/outreach/resume | Resume outreach delivery |
| DELETE | /v1/sdr/searches/:id/outreach | Delete outreach campaign (paired dry_run/confirm) |
| POST | /v1/sdr/searches/:id/outreach/linkedin/connect | Link LinkedIn accounts to this outreach |
| GET | /v1/sdr/outreach/sales-process | Completed SDR outreach campaigns for Sales Process |
SDR Observability
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/sdr/searches/:id/run-state | Primary run state for the search |
| GET | /v1/sdr/searches/:id/run-states | Per-source map of hunter states |
| GET | /v1/sdr/searches/:id/stats?days_back=30 | Signal counts by source over time |
| GET | /v1/sdr/searches/:id/health | Per-search operator dashboard |
| GET | /v1/sdr/recent?limit=20 | Recent signals across the workspace |
| GET | /v1/sdr/company-heat?limit=50 | Hottest companies by composite signal strength |
| GET | /v1/sdr/learning-insights | Workspace-level learned signal weights |
| POST | /v1/sdr/searches/:id/learning-recompute | Manually trigger the learning loop |
| POST | /v1/sdr/searches/:id/sources/pause | Pause one hunter (body: { "source": "linkedin_jobs" }) or all |
| POST | /v1/sdr/searches/:id/sources/resume | Resume one hunter |
| POST | /v1/sdr/searches/:id/run-now | Trigger an immediate run — paired dry_run/confirm |
The 9 Signal Hunters
| Hunter | Signal Source | What It Detects |
|---|---|---|
| linkedin_jobs | LinkedIn job postings | Hiring signals — companies actively building sales/marketing teams |
| linkedin_company | LinkedIn company updates | Company changes — funding, expansion, leadership shifts |
| connected_people | LinkedIn network | Job changes and role transitions in your network |
| ai_web_hunter | Web + AI analysis | News mentions, press releases, product launches |
| crunchbase_rss | Crunchbase feed | Funding rounds, acquisitions, new ventures |
| hn_hiring | Hacker News | Who is Hiring threads — tech company demand signals |
| g2_reviews | G2 Reviews | Competitor reviews — companies evaluating alternatives |
| tech_stack | Technology detection | Technology changes — new stack adoption, migration signals |
| email_enricher | Email verification | Enriches discovered personas with verified email addresses |
Paid vs Free Hunters
Free: linkedin_jobs, linkedin_company, connected_people, crunchbase_rss, hn_hiring
Paid (off by default): ai_web_hunter, g2_reviews, tech_stack — these spend Anthropic + web-search budget per run. Enable via enabled_sources on sdr_create_search or PATCH /v1/sdr/searches/:id.
email_enricher charges 5 credits per enriched contact (transaction type SDR_CONTACT).
Billing
Full read-only billing access. A leaked API key cannot move money — all money-moving paths require the authenticated portal.
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/billing/balance | Current credit balance (lightweight) |
| GET | /v1/billing/balance/full | Balance + plan summary + spent totals |
| GET | /v1/billing/subscription | Current subscription (plan, status, dates) |
| GET | /v1/billing/subscription/limits | Max agents, extra slots, plan status |
| GET | /v1/billing/pricing | Public pricing catalogue (plans + add-ons) |
| GET | /v1/billing/transactions?type=…&from=…&to=…&limit=…&offset=… | Credit transaction history |
| GET | /v1/billing/invoices?year=…&month=… | Stripe invoices (paid + open) |
| GET | /v1/billing/usage/by-type | Spend grouped by action type |
| GET | /v1/billing/usage/monthly | Per-month spend breakdown |
| GET | /v1/billing/usage/by-agent | Spend per agent (workspace-wide) |
| GET | /v1/billing/usage/agents/:agentId | Spend for one agent |
| GET | /v1/billing/usage/agents/:agentId/connections | Per-channel spend for one agent |
| GET | /v1/billing/sdr/email-capacity | SDR sender capacity (included + extras, daily limit) |
Destructive Action Protocol
Any action that's hard to undo requires a two-step confirmation. This protects against accidental launches and ensures AI assistants always show a preview before executing.
How It Works
Step 1: Preview with dry_run
Send {"dry_run": true} to see what would happen without executing.
Step 2: Execute with confirm
After reviewing the preview, send {"confirm": true} to execute the action.
Missing both? → 400 confirmation_required
Sending neither dry_run nor confirm returns an error. Sending both also returns an error (mutual exclusion).
Protected Routes
DELETE /v1/agents/:id— deleting an agentDELETE /v1/campaigns/:id— deleting a campaignPOST /v1/campaigns/:id/launch— launching outreachPOST /v1/agents/:id/deep-scan— deep website scan (15 credits)DELETE /v1/sdr/searches/:id— deleting a Signal SearchDELETE /v1/sdr/searches/:id/outreach— deleting SDR outreachPOST /v1/sdr/searches/:id/outreach/launch— launching SDR outreachPOST /v1/sdr/searches/:id/run-now— manually triggering a hunter (paid sources spend credits)
# Step 1: Preview curl -X POST https://api.vendo-ai.com/v1/campaigns/abc123/launch \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{"dry_run": true}' # Response: preview of what would happen { "data": { "dry_run": true, "would_do": "Launch campaign \"Q3 Outreach · Jun 15, 2026 12:25\"", "campaign_name": "Q3 Outreach · Jun 15, 2026 12:25", "recipient_count": null, "channels": ["email", "linkedin"], "daily_limit": 100, "note": "Confirm to actually start. Once launched, contacts begin receiving outreach." } } # Step 2: Execute after human review curl -X POST https://api.vendo-ai.com/v1/campaigns/abc123/launch \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{"confirm": true}'
Idempotency
For any POST / PATCH / DELETE request, pass an Idempotency-Key header. The API guarantees that replaying the same request with the same key returns the same result without re-executing the side effect.
curl -X POST https://api.vendo-ai.com/v1/campaigns \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: my-unique-key-123" \
-H "Content-Type: application/json" \
-d '{"name": "Q3 Outreach", "agent_id": "..."}'
# Second call with same key → replays cached response.
# Look for the X-Idempotency-Replay: true response header — it tells you
# the request hit the cache instead of running the side effect.
- Same key + same request → cached replay (no side effects)
- Same key + different request → 409
idempotency_conflict - TTL: 24 hours (keys expire after that)
- Namespace: per API key (no cross-tenant collisions)
MCP — Model Context Protocol
The Vendo AI MCP server exposes the entire /v1 API surface as 96 MCP tools that any compatible AI assistant (Claude, ChatGPT, Cursor, Windsurf, etc.) can call. Your AI assistant can create agents, search audiences, launch campaigns, and monitor results — all in natural language.
MCP Endpoint
https://api.vendo-ai.com/mcp — Streamable HTTP transport (POST for JSON-RPC, GET for SSE, DELETE to close session)
MCP Setup & Connection
Claude Desktop / Claude Code
{
"mcpServers": {
"vendo-ai": {
"url": "https://api.vendo-ai.com/mcp",
"headers": {
"Authorization": "Bearer vnd_live_YOUR_KEY_HERE"
}
}
}
}
ChatGPT / Other MCP Clients
Point any MCP-compatible client at https://api.vendo-ai.com/mcp with your API key as the Bearer token. The server uses Streamable HTTP transport and returns a mcp-session-id header that the client must include in subsequent requests.
How MCP Authentication Works
- Your API key is presented as
Authorization: Bearer vnd_live_…at session start - vendo-mcp validates the key through vendo-public-api (same validation as REST)
- vendo-mcp holds no secrets itself — it's a pure pass-through
- Every MCP→API call carries
X-Vendo-Via: mcpso you can distinguish AI activity in audit logs - All security (scopes, rate limits, billing) is enforced in vendo-public-api
96 MCP Tools — Complete Reference
Tools are organized by domain. Destructive actions use paired tool names: preview_* shows what would happen, the action tool executes it. The model must explicitly pick the execute variant — this is stronger than a boolean flag.
Agent Tools
Full lifecycle: create, scan, script, avatar, connections, preview
Campaign & Audience Tools
Create/launch/pause campaigns, search/save audiences
SDR Tools
Signal searches, personas, outreach, observability, hunters
Billing Tools
Balance, subscription, pricing, invoices, usage, capacity
MCP — Agent Tools (35)
Read Operations
| Tool Name | Description |
|---|---|
list_agents | List all AI agents in the workspace |
list_agents_with_stats | List agents with connection + credit stats |
get_agent | Get full details of a specific agent |
get_agent_plan_limits | Capacity check (used vs allowed agent slots) |
list_agent_connections | List all connections for an agent |
list_agent_presentations | List presentations attached to an agent |
list_narrator_leads | Leads captured by the agent's presentations |
get_narrator_analytics | Presentation engagement analytics |
get_widget_embed_code | HTML snippet for the website widget |
list_retell_voices | Available Retell voices for set_agent_voice |
list_google_meet_meetings | List Google Meet meetings booked through this agent |
get_telegram_bot_info | Connected bot info |
get_telegram_analytics | Telegram bot analytics |
Create & Configure
| Tool Name | Description |
|---|---|
create_agent | Create an agent (1 credit) |
update_agent | Update basic-info fields |
set_agent_status | ACTIVE / PAUSED / DRAFT / ARCHIVED |
set_agent_company | Set company name + website + description |
set_agent_voice | Voice / language / speed config |
set_agent_avatar_from_url | Set avatar from a publicly-reachable image URL |
duplicate_agent | Clone an agent |
scan_website_quick | Quick website scan (no agent id) |
save_scan_data | Persist deep-scan output onto an agent |
generate_agent_description | AI company description (1 credit) |
generate_agent_script | Generate full sales script (1 credit, 8 stages) |
connect_google_meet | Returns Google OAuth URL — open in a browser |
disconnect_google_meet | Disconnect Google Meet |
connect_telegram_bot | Connect bot (body: { bot_token }) |
disconnect_telegram_bot | Disconnect Telegram bot |
Preview (Non-Destructive)
| Tool Name | Description |
|---|---|
preview_agent_email | Render an example outreach email |
preview_linkedin_invite | Render a LinkedIn connection request |
preview_linkedin_followup | Render a LinkedIn follow-up message |
preview_deep_scan | What deep_scan_agent would cost + cover |
preview_delete_agent | What delete_agent would remove |
Destructive Actions (Require Prior Preview)
| Tool Name | Description |
|---|---|
deep_scan_agent | Execute deep website scan — 15 credits |
delete_agent | Permanently delete an agent |
MCP — Campaign & Audience Tools (14)
| Tool Name | Description |
|---|---|
list_campaigns | List all campaigns |
get_campaign | Campaign details + live stats |
create_campaign | Create a campaign (DRAFT) |
update_campaign | Update campaign settings |
pause_campaign | Pause all channels |
pause_channel | Pause one channel (email / linkedin / phone_call / voice_call) |
resume_channel | Resume one channel |
archive_campaign | Archive |
preview_launch_campaign | Recipients / channels / cost preview |
launch_campaign | Execute launch |
preview_delete_campaign | Deletion preview |
delete_campaign | Permanently delete |
search_audience | Free preview search of the people graph |
save_audience | Save matched contacts as a reusable audience |
MCP — SDR Tools (34)
| Tool Name | Description |
|---|---|
sdr_list_searches | List Signal Searches in the workspace |
sdr_get_search | One Signal Search by id |
sdr_preview_search | Preview the Claude-generated ICP profile before saving |
sdr_create_search | Create a Signal Search (hunters start immediately) |
sdr_update_search | Update name / sources / regions / profile |
sdr_activate_search | Set status=active |
sdr_pause_search | Pause hunters |
sdr_resume_search | Resume hunters |
sdr_regenerate_search | Re-run Claude on the agent's KB |
sdr_preview_delete_search | Preview deletion |
sdr_delete_search | Permanently delete (paired) |
sdr_get_agent_signal_profile | Read the agent's signal profile |
sdr_generate_agent_signal_profile | (Re-)generate via Claude |
sdr_list_personas | Personas discovered for a search |
sdr_persona_stats | Counts, by-role, top companies, credits spent |
sdr_export_personas_to_audience | Save personas as a reusable audience |
sdr_get_outreach | Outreach campaign status for a search |
sdr_preview_launch_outreach | Preview launch counts + channels |
sdr_launch_outreach | Launch outreach (paired) |
sdr_get_outreach_content | Read configured templates |
sdr_update_outreach_content | Edit templates |
sdr_preview_outreach_content | Render personalised preview |
sdr_pause_outreach | Pause sending |
sdr_resume_outreach | Resume sending |
sdr_preview_delete_outreach | Preview deletion |
sdr_delete_outreach | Delete outreach campaign |
sdr_run_states | Per-source hunter states |
sdr_health | Operator health view for a search |
sdr_signal_stats | Signals by source over the last N days |
sdr_recent_signals | Workspace-wide recent signals |
sdr_company_heat | Hottest companies by composite signal strength |
sdr_learning_insights | Per-signal-type weights from outcome learning |
sdr_preview_run_now | Preview triggering an immediate hunter run |
sdr_run_now | Trigger an immediate hunter run (paired) |
MCP — Billing Tools (13)
| Tool Name | Description |
|---|---|
get_balance | Current credit balance (lightweight) |
get_balance_full | Balance + plan + spent totals |
get_subscription | Plan, status, period dates, currency |
get_subscription_limits | Max agents (base + add-on slots) |
get_pricing | Public pricing catalogue (plans + add-ons) |
get_credit_transactions | Credit transaction history with filters |
get_invoices | Stripe invoice history |
get_credit_usage_by_type | Spend grouped by action type |
get_credit_usage_monthly | Per-month spend breakdown |
get_credit_usage_by_agent | Spend per agent (workspace-wide) |
get_credit_usage_for_agent | Spend for one agent |
get_credit_usage_for_agent_connections | Per-channel spend for one agent |
get_sdr_email_capacity | SDR managed-sender entitlement + daily limit |
MCP — Destructive Action Safety
In MCP, destructive actions use paired tool names instead of boolean flags. This is safer because the AI model must explicitly choose the execute variant — it can't accidentally pass confirm: true to a tool.
| Preview Tool | Execute Tool | Action |
|---|---|---|
preview_launch_campaign | launch_campaign | Launch outreach campaign |
preview_delete_agent | delete_agent | Delete an AI agent |
preview_delete_campaign | delete_campaign | Delete a campaign |
preview_deep_scan | deep_scan_agent | Deep website scan (15 credits) |
sdr_preview_delete_search | sdr_delete_search | Delete a Signal Search |
sdr_preview_launch_outreach | sdr_launch_outreach | Launch SDR outreach |
sdr_preview_delete_outreach | sdr_delete_outreach | Delete SDR outreach campaign |
sdr_preview_run_now | sdr_run_now | Manual hunter trigger |
Why Paired Names?
The tool name itself encodes intent. An AI assistant cannot accidentally call launch_campaign when it meant to preview — it has to deliberately pick the execute name. Combined with tool descriptions that say "Only call AFTER the user has reviewed the preview," this gives stronger safety than a boolean flag.
Guide: Create an Agent via API
The full agent onboarding pipeline:
# 1. Create the agent (description is REQUIRED — NOT NULL in DB). AGENT=$(curl -s -X POST https://api.vendo-ai.com/v1/agents \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"name": "Sales Agent", "description": "Outbound SDR for SaaS"}') AGENT_ID=$(echo $AGENT | jq -r '.data.id') # 2. (Optional) quick scan to fetch the company website's structure. curl -s -X POST https://api.vendo-ai.com/v1/agents/scan \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"website_url": "https://example.com"}' # 3. Set company info — REQUIRED before generate-script will work. curl -s -X PATCH https://api.vendo-ai.com/v1/agents/$AGENT_ID/company \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "company_name": "Example Inc", "company_website": "https://example.com", "company_description": "We build internal tools for revenue teams." }' # 4. Generate the conversational + email script (1 credit, 8-stage AI). curl -s -X POST https://api.vendo-ai.com/v1/agents/$AGENT_ID/generate-script \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"script_style": "FRIENDLY_CASUAL", "purpose": "sales"}' # 5. Set the avatar from a public URL. The API downloads and stores it locally. curl -s -X PATCH https://api.vendo-ai.com/v1/agents/$AGENT_ID/avatar \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"image_url": "https://example.com/avatar.jpg"}' # 6. Preview what this agent would send before launching anything. curl -s -X POST https://api.vendo-ai.com/v1/agents/$AGENT_ID/preview/email \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" -d '{}'
Guide: Launch a Campaign
# 1. Search for audience curl -s -X POST https://api.vendo-ai.com/v1/audiences/search \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"positions": ["CTO", "VP Engineering"], "countries": ["United States"], "companySizes": ["small", "medium"]}' # 2. Save the audience AUDIENCE=$(curl -s -X POST https://api.vendo-ai.com/v1/audiences \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"name": "Tech Leaders Q3", "search_params": {...}}') # 3. Create campaign CAMPAIGN=$(curl -s -X POST https://api.vendo-ai.com/v1/campaigns \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"name": "Q3 Outreach", "agent_id": "...", "audience_id": "..."}') CAMPAIGN_ID=$(echo $CAMPAIGN | jq -r '.data.id') # 4. Preview launch (dry_run) curl -s -X POST https://api.vendo-ai.com/v1/campaigns/$CAMPAIGN_ID/launch \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"dry_run": true}' # 5. Launch after review curl -s -X POST https://api.vendo-ai.com/v1/campaigns/$CAMPAIGN_ID/launch \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"confirm": true}'
Guide: SDR Signal Pipeline
# 0. (Optional) Preview the AI-generated profile before creating the search curl -s -X POST https://api.vendo-ai.com/v1/sdr/searches/preview \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"agent_id": "AGENT_UUID"}' # 1. Create a signal search (target_regions is required by the wizard). # workspace_id and user_id are injected automatically from your API key. SEARCH=$(curl -s -X POST https://api.vendo-ai.com/v1/sdr/searches \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "VP Sales hunt — US", "agent_id": "AGENT_UUID", "target_regions": ["US"], "enabled_sources": ["linkedin_jobs", "connected_people"] }') SEARCH_ID=$(echo $SEARCH | jq -r '.data.search.id') # 2. List people the hunters discovered curl -s "https://api.vendo-ai.com/v1/sdr/people?search_id=$SEARCH_ID&limit=20" \ -H "Authorization: Bearer $KEY" # 3. Check signal stats for that search (default window: last 30 days) curl -s "https://api.vendo-ai.com/v1/sdr/searches/$SEARCH_ID/stats" \ -H "Authorization: Bearer $KEY" # 4. Export people to a saveable audience that any campaign can use curl -s -X POST https://api.vendo-ai.com/v1/sdr/people/export-to-audience \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d "{ \"search_id\": \"$SEARCH_ID\", \"name\": \"Signal-found leads\" }"
Guide: Zapier & Make Integration
Connect Vendo AI to 5,000+ apps through Zapier or Make (Integromat):
Zapier: Use Webhooks by Zapier
- Add a "Webhooks by Zapier" action step
- Choose "Custom Request"
- Set method, URL (e.g.,
https://api.vendo-ai.com/v1/agents), and headers (Authorization: Bearer vnd_live_...) - Set
Content-Type: application/jsonand add your request body
Make: Use HTTP module
- Add an "HTTP: Make a request" module
- Set URL, method, and headers identically
- Parse the JSON response to use in subsequent steps
Scopes Reference
Every API key has a set of scopes that control which endpoints it can access. By default, all scopes are granted when you create a key.
| Scope | Allows |
|---|---|
| agents:read | List and get agents, connections, previews |
| agents:write | Create, update, delete agents; scan websites; generate scripts |
| audiences:read | Search the people graph (preview) |
| audiences:write | Save audiences, enrich contacts |
| campaigns:read | List and get campaigns with stats |
| campaigns:write | Create, update, delete campaigns |
| campaigns:control | Launch, pause, resume, archive campaigns (separate scope for safety) |
| analytics:read | Funnel and per-campaign analytics |
| billing:read | Credit balance, subscriptions, invoices, usage history |
No billing:write — By Design
There is intentionally no billing:write scope. Top-ups, plan changes, and payment actions happen only in the authenticated portal. A leaked key cannot spend money beyond the metering it already triggers through normal API usage.
What's Intentionally Out of Scope (and Why)
These actions are deliberately NOT exposed by the Public API or MCP. They remain UI-only because a leaked API key must never move money outside the metering it already triggers, and Stripe Checkout / Customer Portal flows are inherently browser-bound:
- Subscription Checkout (
POST /api/billing/stripe/create-checkout-session) - One-time credit top-up Checkout (
POST /api/billing/stripe/create-credit-checkout) - Stripe Customer Portal redirect (
POST /api/billing/stripe/customer-portal) - Retry payment on an open invoice (
POST /api/billing/stripe/pay-invoice) - Cancel / resume a subscription (
POST /api/billing/subscriptions/cancel|resume) - Buy extra agent slot ($20/mo recurring add-on)
- Buy extra SDR sender pair ($20/mo recurring add-on)
There is no billing:write scope — one was never created. Customers who need automated top-ups can use the Stripe Customer Portal directly and set auto-recharge there. We are tracking webhook-based notifications (credits.low, subscription.canceled) as a future addition — see "What's Next" below.
Changelog
2026-06-15 — Full Platform Coverage
- Phase 5c — 13 billing read-only tools and 13 endpoints (balance, subscriptions, invoices, usage)
- Phase 5b — 34 SDR tools, 37 endpoints covering the full signal pipeline
- Phase 5a — 29 agent tools, 59 endpoints covering full agent lifecycle
- Phase 4 — MCP server launched at
api.vendo-ai.com/mcp - Phase 2.5 — Destructive action protocol, idempotency keys
- Phase 3 — Frontend Settings → API & MCP tab shipped
- Phases 1–2 — Core API: agents read, campaigns CRUD, audiences, billing balance
What's Next
Webhooks — outbound events for campaign.launched, email.replied, persona.discovered
OpenAPI spec — downloadable at /v1/openapi.json
Spend ceiling — per-session credit limits for MCP usage
