Four Ways to Connect
Everything you do in the dashboard — searching contacts, enriching data, managing campaigns — you can also do from AI assistants, scripts, or external tools. Pick whichever fits your workflow.
Getting Started (5 minutes)
- Go to Settings → API Tokens and create a token. Copy the
kv_...value. - Choose your method:
- MCP: Add the config block below to Claude Desktop or Claude Code
- API: Pass
Authorization: Bearer kv_your_tokenon any/api/v2/call - CLI: Set
KOLVERA_API_KEY=kv_your_tokenas an environment variable - Webhooks: Call
POST /api/v2/webhookswith your URL and events
- Test it: try
GET /api/v2/creditsto check your balance, or ask Claude “check my Kolvera credits.”
Real-World Use Cases
Build a target list and start outreach in one conversation
You say: “Research Australian fintech companies in Melbourne with 20-50 employees. Create an ICP profile called Q3 Fintech, add the top companies to a hot list, find emails for all contacts, then enrol anyone with a verified email in my Q3 Campaign.”
What happens behind the scenes:
- Claude calls
trigger_deep_researchwith your brief (3cr) - Polls
get_research_reportuntil research completes - Creates ICP via
create_icp_profile - Creates hot list via
create_hot_listand adds companies viaadd_to_hot_list - Calls
find_contact_emailon each contact (2cr per email found) - Enrols verified contacts via
enrol_contacts_in_campaign
Daily morning briefing via Claude
You say: “Give me a morning rundown — how are my campaigns performing, do I have any meetings today, and what’s my credit balance?”
Claude calls
list_campaigns (shows open/reply rates), list_meetings with upcoming_only,
and get_credit_balance. Returns a summary like:“Your Q2 .NET Campaign has a 42% open rate and 8% reply rate across 120 sends. You have 3 meetings today — 9am with Sarah Chen, 11am with Mike Roberts, 2pm with Acme Corp. Credit balance: 847 plan + 150 addon = 997 total.”
Ping Slack when a prospect replies
Setup: Create a webhook for
campaign.replied pointing at a Slack incoming webhook URL
(or Zapier/Make trigger). Every time a prospect replies, Kolvera instantly sends their name, email, and campaign to your channel.curl -X POST https://www.kolvera.io/api/v2/webhooks \
-H "Authorization: Bearer kv_your_token" \
-H "Content-Type: application/json" \
-d '{"url": "https://hooks.slack.com/your-hook",
"events": ["campaign.replied", "campaign.bounced"],
"secret": "my_signing_key"}'
Cost: Free. Webhooks never consume credits.
Get alerted when credits run low
How: Subscribe to
credit.low. When your balance drops below 10,
Kolvera sends a webhook to your Slack channel or email so you can top up before your next
enrichment run. Useful when you have scheduled scripts doing batch find-email or find-phone.
Weekly export of enriched contacts
How: Schedule a script that pulls contacts with verified emails and writes them to a CSV or pushes to your CRM:
# Every Monday at 8am 0 8 * * 1 python kolvera_cli.py contacts search --has-email yes --per-page 500 | jq '.contacts' > weekly_contacts.jsonCost: Free. Reading data never uses credits.
Sync new contacts to Google Sheets via Zapier
How: Subscribe to
contact.created and contact.enriched,
point them at a Zapier webhook trigger, then map fields to your Google Sheet columns.
Every new contact or enrichment automatically appears in your spreadsheet.
Batch enrich contacts from a script
import requests, time
API = "https://www.kolvera.io/api/v2"
HEADERS = {"Authorization": "Bearer kv_your_token"}
# Get contacts missing emails
r = requests.get(f"{API}/contacts", headers=HEADERS,
params={"has_email": "no", "per_page": 50})
contacts = r.json()["contacts"]
for c in contacts:
result = requests.post(
f"{API}/contacts/{c['id']}/find-email",
headers=HEADERS
).json()
if result.get("email"):
print(f"Found: {c['first_name']} {c['last_name']} → {result['email']}")
time.sleep(2) # respect rate limits
Cost: 2cr per email found. Contacts where no email is found are free.
Ask Claude to manage your pipeline
You say: “Show me all Python developer jobs in NSW, then find the companies posting them and check if we have contacts there.”
Claude calls
search_pipeline_jobs with query “python” and state filter NSW,
then for each unique company calls search_companies to find matches and
get_company_contacts to show who you already know. Gives you a prioritised list of
warm leads vs cold outreach targets.
MCP Server — Setup & Tools
MCP (Model Context Protocol) lets AI assistants use Kolvera as a tool. You talk in plain English, the AI calls Kolvera behind the scenes.
Setup Guide (5 steps)
Step 1: Generate your config
Go to Integrations and click Generate Config on the AI Assistant (MCP) card.
Step 2: Copy the config
Click Copy to copy the JSON config to your clipboard.
Step 3: Open Claude Desktop settings
In Claude Desktop, go to Settings → Developer → Edit Config.
Step 4: Find the config file
Edit Config opens your file explorer. Open claude_desktop_config.json in any text editor.
Step 5: Paste and save
If the file is empty or only has {}, paste the entire config you copied.
If it already has content (like a "preferences" section), paste the "kolvera": { ... } block inside the existing "mcpServers" object. If there’s no "mcpServers" key, add one at the top level.
Save the file and restart Claude Desktop. You should see "kolvera" with a green running badge in Settings → Developer.
Requires Node.js — the config uses npx mcp-remote to connect. If you don’t have Node.js, install it here (LTS version recommended).
98 Tools Available
You don’t need to memorise these — just describe what you want and the AI picks the right tool.
Contacts (11 tools)
search_contacts — search by name, title, email, company. Filter by has_email, has_phone, is_prospectget_contact — full detail with company, email status, phone, LinkedIn, notescreate_contact — add a contact, optionally link to company and mark as prospectupdate_contact — edit name, title, email, phone, location, notes, target roledelete_contact — permanently remove a contact and all linked recordsfind_contact_email — multi-source email enrichment (2cr on success)find_contact_phone — phone enrichment: cached → native → directory (2-6cr on success)verify_contact_email — verify an existing email address (free)bulk_find_emails — find emails for multiple contacts at once (2cr each on success)bulk_find_phones — find phones for multiple contacts at once (2-6cr each on success)list_profile_suggestions — AI-suggested profile updates from meeting transcriptsCredits (3 tools)
get_credit_balance — plan balance + addon balance + totalget_bulk_enrichment_status — check progress of running bulk enrichment operationsget_credit_history — paginated transaction log with action filterCompanies (7 tools)
search_companies — search by name, domain, industry, state, BD status, locationget_company — full detail with contact count, domain, ABN, phonecreate_company — add a company with name, domain, industry, locationget_company_contacts — paginated list of contacts at a companyupdate_company — edit industry, phone, location, BD status, notes, do-not-contact flagresearch_company — AI research on a company: hiring signals, growth, industry context (1cr)find_company_contacts — find contacts at a company via enrichment providers (2cr on success)Campaigns (18 tools)
list_campaigns — all campaigns with enrolled/sent/opened/replied statsget_campaign — campaign detail with email steps, variants, and performanceget_campaign_stats — open rate, reply rate, bounce rate for a campaigncreate_campaign — create a draft campaign, optionally link an ICP for AI contextupdate_campaign — edit name, settings, timezone, daily limitsdelete_campaign — permanently remove a draft campaigncreate_campaign_step — add an email step to a campaign with subject, body, delayupdate_campaign_step — edit subject, body, delay for a specific stepdelete_campaign_step — remove a step from the sequencegenerate_campaign_steps — AI-generate a multi-step email sequence using your ICP and business context (free)get_campaign_generation_status — poll async step generation progressenrol_contacts_in_campaign — add contacts by ID, with dedup and blocklist checksget_campaign_enrollments — list enrolled contacts with status and next send timeunenrol_from_campaign — remove contacts from a campaignactivate_campaign — start sending (requires confirm=true, preview returned by default)pause_campaign — stop sending (only works on active campaigns)resume_campaign — restart sending (only works on paused campaigns)duplicate_campaign — clone a campaign with all email steps (no enrollments copied)Pipeline (2 tools)
search_pipeline_jobs — search scraped jobs by title, company, state, sector, sourceget_pipeline_job — full job detail with salary, location, posting dateDeep Research (4 tools)
trigger_deep_research — discover companies matching a brief (3cr). Link an ICP for tighter results. Runs async — poll with get_research_reportexpand_deep_research — find MORE companies from the same brief, excluding duplicates (2cr). Appends to the same reportget_research_report — results with discovered companies, market insights, and sourceslist_research_reports — all past research reportsHot Lists (7 tools)
list_hot_lists — all curated lists with member countsget_hot_list — list members with contact details, paginatedcreate_hot_list — create a new curated listadd_to_hot_list — add contacts, prospects, or candidates by IDremove_from_hot_list — remove members from a hot listdelete_hot_list — permanently delete a hot listupdate_hot_list — edit hot list name and descriptionIdeal Client Profiles (12 tools)
list_icp_profiles — all ICP profiles with prospect countsget_icp_profile — profile detail with company map and criterialist_icp_prospects — prospects linked to an ICP, with email status filtercreate_icp_profile — define target industries, locations, company sizes, titles manuallyupdate_icp_profile — edit title, industries, locations, sizes, titles, keywordsgenerate_icp_profile — AI-generate a full profile from a brief description: pain points, value prop, differentiators, objection handling, SEEK keywords (2cr)archive_icp_profile — soft delete (prospects preserved, ICP hidden)delete_icp_profile — permanent delete (prospects unlinked, company map deleted)link_prospect_to_icp — link a prospect to an ICPunlink_prospect_from_icp — remove a prospect’s ICP linklink_company_to_icp — add a company to an ICP’s company map with tierunlink_company_from_icp — remove a company from an ICP’s company mapMPC Profiles (6 tools)
list_mpc_profiles — all MPC Profiles with company/candidate countsget_mpc_profile — profile detail with must-haves, move triggers, disqualifierscreate_mpc_profile — define a target role manuallyupdate_mpc_profile — edit all fields: title, sectors, employers, locations, must-haves, disqualifiers, LinkedIn keyword, tone, ICP linkdelete_mpc_profile — permanent deletegenerate_mpc_profile — AI-generate from a role title and context: title variants, move triggers, objections, LinkedIn boolean (1cr)Business Contexts (5 tools)
list_business_contexts — all business contexts with primary flagcreate_business_context — add a new business context (name, what you sell, buyers)update_business_context — edit context fieldsdelete_business_context — remove a business contextset_primary_business_context — set which context is used by default for AIJob Scraping (10 tools)
run_job_scrape — scrape SEEK, Indeed, LinkedIn, or Reed for live job listings. Optionally link an ICP for auto-configrun_saved_config — re-run an existing saved search configget_scrape_progress — poll scrape status (percent, phase, new/skipped counts)list_scrape_configs — all saved search configsget_scrape_config — detail of a saved config with keywords, locations, excludesupdate_scrape_config — edit keywords, locations, exclude terms, SEEK classificationarchive_scrape_config — soft-archive a search configdelete_scrape_config — permanently delete a config (requires confirm=true)analyze_scrape_quality — quality analysis of scraped job resultsupdate_search_config_excludes — update exclude keywords and companies on a search configIdeal Candidates (6 tools)
list_ideal_candidates — all ideal candidate profilesget_ideal_candidate — profile detail with must-haves, sectors, employerscreate_ideal_candidate — define a target candidate profile manuallyupdate_ideal_candidate — edit all fieldsdelete_ideal_candidate — permanent deletegenerate_ideal_candidate — AI-generate from role title and context (1cr)Meetings & Fathom (7 tools)
list_meetings — upcoming or all meetings, with contact infoget_meeting — meeting detail with Google Meet link, contact, notescreate_meeting — schedule a meeting with title, time, contact, locationsync_fathom_meetings — sync meeting recordings from Fathomlist_fathom_notes — meeting summaries from Fathom, optionally filtered by contactupdate_meeting — edit meeting title, time, notes, or statusdelete_meeting — permanently delete a meetingExample Conversations
Claude: You have 3 active campaigns. “Q2 .NET Sydney” leads with 42% open rate and 12% reply rate across 85 sends. “AU Fintech BD” has 38% open and 6% reply across 120 sends. “NZ DevOps” just started — 15 sends, 2 opens so far.
Claude: Found 23 contacts in VIC Targets without emails. Running enrichment now... Found 18 emails (36cr). 5 couldn’t be found. Want me to enrol the 18 with verified emails in a campaign?
Claude: Created meeting “Acme Corp - Introduction” for Thursday 15 May at 2:00 PM AEST with Sarah Chen (sarah.chen@acmecorp.com.au). Duration: 30 minutes.
REST API v2 — 44 Endpoints
Base URL: https://www.kolvera.io/api/v2
Auth: Authorization: Bearer kv_your_token (or OAuth access token)
Contacts (7)
| GET | /contacts | Search (?q=, &has_email=, &has_phone=, &is_prospect=, &sort=, &page=) |
| GET | /contacts/:id | Contact detail with company info |
| POST | /contacts | Create contact (auto-links or creates company) |
| PATCH | /contacts/:id | Update fields |
| DELETE | /contacts/:id | Delete contact |
| POST | /contacts/:id/find-email | Find email (2cr on success) |
| POST | /contacts/:id/find-phone | Find phone (2-6cr on success) |
Companies (6)
| GET | /companies | Search (?q=, &industry=, &state=, &bd_status=) |
| GET | /companies/:id | Company detail + contact count |
| GET | /companies/:id/contacts | Contacts at company (paginated) |
| PATCH | /companies/:id | Update fields |
| POST | /companies/:id/research | Run AI research on company (1cr) |
| POST | /companies/:id/find-contacts | Find contacts at company (2cr per contact found) |
Campaigns (7)
| GET | /campaigns | List with stats (?status=active) |
| GET | /campaigns/:id | Detail + email steps + stats |
| GET | /campaigns/:id/stats | Open / reply / bounce rates |
| POST | /campaigns/:id/activate | Activate a draft campaign |
| POST | /campaigns/:id/pause | Pause sending |
| POST | /campaigns/:id/resume | Resume sending |
| POST | /campaigns/:id/enrol | Enrol contacts {contact_ids: [...]} |
Hot Lists (5)
| GET | /hot-lists | List all hot lists |
| GET | /hot-lists/:id | Members with contact details (paginated) |
| POST | /hot-lists | Create {name, description} |
| POST | /hot-lists/:id/members | Add members {source_ids: [...]} |
| DELETE | /hot-lists/:id/members/:mid | Remove member |
ICP Profiles (5)
| GET | /icp | List all ICP profiles |
| GET | /icp/:id | Profile + company map + prospect count |
| POST | /icp | Create {title, target_industries, target_locations, ...} |
| POST | /icp/generate | AI-generate ICP profile (2cr) |
| PATCH | /icp/:id | Update profile criteria |
Meetings (4)
| GET | /meetings | List (?status=, &upcoming=true) |
| GET | /meetings/:id | Meeting detail + Google Meet link |
| POST | /meetings | Create {title, starts_at_utc, duration_minutes, ...} |
| PATCH | /meetings/:id/status | Update status (booked / attended / no_show / cancelled) |
Pipeline & Research (5)
| GET | /pipeline | Search jobs (?q=, &status=, &state=, §or=) |
| GET | /pipeline/:id | Job detail |
| GET | /research | List research reports |
| GET | /research/:id | Report + discovered companies |
| POST | /research | Trigger Deep Research {brief: "..."} (3cr) |
Credits & Webhooks (5)
| GET | /credits | Plan + addon balance |
| GET | /webhooks | List webhook subscriptions |
| POST | /webhooks | Create {url, events, secret} |
| PATCH | /webhooks/:id | Update subscription |
| DELETE | /webhooks/:id | Remove subscription |
Quick Test
curl -H "Authorization: Bearer kv_your_token" \
"https://www.kolvera.io/api/v2/credits"
# Response:
# {"ok": true, "plan_balance": 847, "addon_balance": 150, "total": 997}
Webhooks — 14 Real-Time Events
Instead of polling the API to check “did anyone reply?”, Kolvera sends a POST request to your URL the moment it happens. Connect to Slack, Zapier, Make, or your own server.
Setup in 3 Steps
- Pick a URL that can receive POST requests (Slack hook, Zapier trigger, your server, etc.)
- Register:
curl -X POST https://www.kolvera.io/api/v2/webhooks \ -H "Authorization: Bearer kv_your_token" \ -H "Content-Type: application/json" \ -d '{"url": "https://hooks.zapier.com/your-hook", "events": ["campaign.replied", "contact.enriched"], "secret": "optional_signing_key"}' - Kolvera sends a JSON POST to your URL when the event fires
All 14 Events
| Event | When It Fires | Data Included |
|---|---|---|
contact.created | New contact added | Full contact object |
contact.updated | Contact fields changed | Contact ID + changed fields |
contact.enriched | Email or phone found via enrichment | Contact ID, type, found data |
company.created | New company created | Company ID + name |
company.updated | Company fields changed | Company ID + changed fields |
campaign.activated | Campaign started or resumed | Campaign ID + name |
campaign.paused | Campaign paused | Campaign ID + name |
campaign.completed | Contact finishes all email steps | Campaign ID, contact ID, enrollment ID |
campaign.replied | Prospect replies to outreach | Campaign ID, contact details |
campaign.bounced | Hard bounce detected | Campaign ID, email, error |
meeting.created | Meeting scheduled | Full meeting object |
meeting.status_changed | Status updated (attended, no-show) | Meeting ID, new status |
research.completed | Deep Research finishes | Report ID, brief, companies found |
credit.low | Balance drops to 10 or below | Current balance, action, amount |
Verifying Signatures
If you set a secret, every webhook includes an X-Kolvera-Signature header
(HMAC-SHA256 of the body). Verify it to confirm the request came from Kolvera:
import hmac, hashlib
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
Subscriptions auto-disable after 10 consecutive delivery failures.
CLI Tool — 20 Commands
Outputs JSON. Pipe to jq for formatting, save to files, or chain in shell scripts.
Setup
# Linux / Mac export KOLVERA_API_KEY=kv_your_token # Windows PowerShell $env:KOLVERA_API_KEY = "kv_your_token"
Contacts
# Search contacts with filters python kolvera_cli.py contacts search "developer" --has-email yes --sort updated_at # Get full contact detail python kolvera_cli.py contacts get <contact_id> # Create a contact (auto-links company) python kolvera_cli.py contacts create --first-name "Sarah" --last-name "Chen" \ --email "sarah@acme.com" --company "Acme Corp" --prospect # Find email for a contact (2cr if found) python kolvera_cli.py contacts find-email <contact_id> # Find phone (2-6cr if found) python kolvera_cli.py contacts find-phone <contact_id>
Companies
# Search by industry and state python kolvera_cli.py companies search "recruitment" --state VIC --industry "Staffing" # View company detail python kolvera_cli.py companies get <company_id> # List contacts at a company python kolvera_cli.py companies contacts <company_id>
Campaigns
# List campaigns (optionally filter by status) python kolvera_cli.py campaigns list --status active # View campaign detail with steps python kolvera_cli.py campaigns get <campaign_id> # Check performance stats python kolvera_cli.py campaigns stats <campaign_id> # Pause / resume python kolvera_cli.py campaigns pause <campaign_id> python kolvera_cli.py campaigns resume <campaign_id> # Enrol contacts into a campaign python kolvera_cli.py campaigns enrol <campaign_id> --contact-ids id1 id2 id3
Pipeline, Research & Credits
# Search pipeline jobs python kolvera_cli.py pipeline search "python" --state-filter NSW # View job detail python kolvera_cli.py pipeline get <job_id> # Trigger Deep Research (3cr) python kolvera_cli.py research trigger "AU fintech companies in Melbourne" # View research results python kolvera_cli.py research get <report_id> # List all research reports python kolvera_cli.py research list # Check credit balance python kolvera_cli.py credits
Practical: Batch Enrich and Enrol
# Find contacts without emails, enrich them, enrol verified ones CONTACTS=$(python kolvera_cli.py contacts search --has-email no --per-page 100) # Get IDs echo "$CONTACTS" | jq -r '.contacts[].id' | while read ID; do python kolvera_cli.py contacts find-email "$ID" sleep 2 done # Check balance after enrichment python kolvera_cli.py credits
OAuth 2.0 — For App Developers
Building an app that connects to Kolvera on behalf of other users? Use OAuth instead of API tokens. Each user gets their own authorised connection with specific permissions.
How It Works
- Your app redirects the user to Kolvera’s consent screen
- They see what permissions your app is requesting and click “Authorise”
- Kolvera redirects back with a temporary code
- Exchange the code for an access token (1hr) and refresh token (30 days)
- Use the access token on
/api/v2/*endpoints like any Bearer token
Endpoints
| Authorise | GET /oauth/authorize |
| Token | POST /oauth/token |
| UserInfo | GET /oauth/userinfo |
| Revoke | POST /oauth/revoke |
| Discovery | GET /oauth/.well-known/openid-configuration |
17 Permission Scopes
contacts:read — view contactscontacts:write — create/edit contactscontacts:enrich — find emails/phonescampaigns:read — view campaignscampaigns:write — manage campaignspipeline:read — view jobsresearch:read — view reportsresearch:write — run researchhot_lists:read — view listshot_lists:write — manage listsicp:read — view ICP profilesicp:write — manage ICP profilesmeetings:read — view meetingsmeetings:write — create meetingswebhooks:manage — manage webhookscredits:read — view balanceprofile:read — view user infoPKCE (S256) supported for public clients. Access tokens expire after 1 hour.
Rate Limits & Credits
| Action | Rate Limit | Credit Cost |
|---|---|---|
| Search / list / view (any GET) | 60-120/min | Free |
| Create / update / delete | 10-30/min | Free |
| Find Email | 30/min | 2cr on success |
| Find Phone | 30/min | 2-6cr on success |
| Deep Research | 5/min | 3cr per run |
| Webhooks (receiving) | Unlimited | Free |
Credits are only charged when data is actually found. Failed lookups are free.
Check your balance anytime: GET /api/v2/credits or ask Claude “check my Kolvera credits.”