anVendor API and MCP server

Use anVendor from your own code and AI assistants: analyze companies, scan a service across up to 10,000 companies and discover companies, with API keys, per-key budgets and the same credits as the app.

Getting started

curl https://api.anvendor.com/v1/balance \
  -H "Authorization: Bearer avk_…"

How requests behave

Methods

GET /v1/balance

Your plan, credits left (plan allowance and extra credits) and this key's budget. Available to every key.

POST /v1/analyses

Analyze a company: every tracked service it uses, with estimated adoption and estimated annual spend. Key method: analyze. Costs 1 credit, refunded when nothing is found; a fresh result you already paid for is returned free.

curl -X POST https://api.anvendor.com/v1/analyses \
  -H "Authorization: Bearer avk_…" -H "Content-Type: application/json" \
  -d '{"company": "acme.com"}'

# 202 Accepted
{ "id": "…", "status": "pending", "pollAfterSeconds": 60, "services": [], … }

company is a domain, a website URL or a company name. Add "refresh": true to scan again even when a fresh result exists.

GET /v1/analyses/{id}

Poll an analysis. status is pending, done or failed; when done, company and services carry the result.

{ "id": "…", "status": "done",
  "company": { "domain": "acme.com", "name": "Acme", "headcount": 900, "location": "Oakland, CA, US", … },
  "services": [ { "name": "Slack", "domain": "slack.com", "adoptionPercent": 40,
                  "estimatedAnnualSpend": { "lowUsd": 12500, "highUsd": 48000, "openEnded": false, "label": "$12.5k – $48k / yr" } } ],
  "dataDate": "2026-09-20T…", "stale": false, "partial": false }

POST /v1/scans

Check one service at a list of companies. Key method: scan. Costs 1 credit per company confirmed to use the service; refunded when it is not found; free for a company you already paid for, or one checked within 30 days and found not to use it.

curl -X POST https://api.anvendor.com/v1/scans \
  -H "Authorization: Bearer avk_…" -H "Content-Type: application/json" \
  -d '{"service": "slack.com", "companies": ["acme.com", "Globex Corporation"]}'
  • companies takes up to 10,000 domains, website URLs or company names.
  • Up to 100 domains: all or nothing — refused with 402 unless every chargeable company is affordable; answers we already hold come back at once.
  • More than 100, or any company name: the scan runs in the background and stops at what your balance and the key's budget cover. A name is matched to at most one company with the same name; a name with no match is reported as unresolved and never charged. Domains are the most precise input.
  • "dryRun": true returns a quote — companies, free answers, the maximum charge and how many your balance covers — and starts nothing.
  • "refresh": true re-scans one company you already paid for, and charges again.

GET /v1/scans/{id}?offset=0&limit=100

A scan's progress and a page of results, one per company in the order given. Each result has status (pending, done, error, unfunded, resolving, unresolved, excluded), detected (true, false or null) and, for a confirmed company, its figures. GET /v1/scans lists your 50 most recent scans.

POST /v1/leads/search

Discover companies for a service — free. Key method: leads. Companies known to use the service come first; figures stay hidden (locked) until you scan the company for that service.

curl -X POST https://api.anvendor.com/v1/leads/search \
  -H "Authorization: Bearer avk_…" -H "Content-Type: application/json" \
  -d '{"service": "hubspot.com", "headcount": ["51-200", "201-500"],
       "locations": [{"kind": "country", "label": "Spain", "value": {"country": "ES"}}]}'

Filters: locations (objects from GET /v1/leads/filters or GET /v1/leads/locations?q=…, passed back unchanged), one industry, headcount buckets, or a companies list instead of filters. Pass the response's next back as offset or companyCursor for the next page; up to 10,000 companies are reachable.

GET /v1/openapi.json

The full OpenAPI 3.1 description. No key needed.

Errors

Errors are JSON: {"error": {"code": "…", "message": "…"}}.

MCP server for AI assistants

The same methods, as tools for MCP clients: https://api.anvendor.com/mcp (Streamable HTTP). The tools listed are the methods the connection may call: get_balance, analyze_company, get_analysis, scan_service, get_scan, list_scans, search_leads, get_lead_filters, suggest_locations. A scan of more than one company returns a quote first and starts only when called again with confirm: true, so an assistant asks before spending. A budget keeps an assistant within it.

Connect by signing in (claude.ai, ChatGPT and other connectors)

Add https://api.anvendor.com/mcp as a custom connector. The app sends you to anVendor: sign in as usual — email and password, Google or LinkedIn — then choose the methods it may call and a credit budget (50 credits a month unless you change it), and allow it. No key to copy. The app appears under Connected apps on your API page, where you can see what it spent and disconnect it. A connection nobody uses for 90 days lapses.

For client developers: OAuth 2.1 with PKCE (S256) and dynamic client registration. Discovery starts at https://api.anvendor.com/.well-known/oauth-protected-resource (also sent in the WWW-Authenticate header of a 401 from /mcp); the authorization server is https://anvendor.com. Access tokens last an hour; refresh tokens rotate on every use, and presenting a used one disconnects the app.

Connect with a key

Claude Code:

claude mcp add --transport http anvendor https://api.anvendor.com/mcp \
  --header "Authorization: Bearer avk_…"

Cursor, VS Code and other clients (JSON configuration):

{
  "mcpServers": {
    "anvendor": {
      "url": "https://api.anvendor.com/mcp",
      "headers": { "Authorization": "Bearer avk_…" }
    }
  }
}