Vexi Docs
Structured Business Data for AI Agents
Vexi returns a complete Agent Business Object (ABO) for any business β structured, confidence-scored, and ready for your agent to act on. One API call replaces hours of web scraping.
Fast
p95 under 200ms for cached ABOs
Typed
Predictable JSON schema, every time
Agent-ready
MCP server included, works with Claude, Cursor, LangChain
Global
40+ countries, all business types
Quick Start #
Get your first ABO in under 2 minutes.
1Get your API key
Sign up at getvexi.dev and create a key in your dashboard. You'll get a vxi_test_ key by default β switch to vxi_live_ when you're ready for production traffic.
2Make your first request
Pass your key as a Bearer token. This searches for the top three CRM platforms in the US:
curl "https://api.getvexi.dev/v1/search?q=CRM+software&location=US&limit=3" \ -H "Authorization: Bearer vxi_test_β’β’β’β’β’β’β’β’"
3Read the response
You'll get back an array of ABOs, each with a confidence score, canonical fields, and a stable slug for follow-up calls.
βΈ{ 3 results Β· query_id: q_8f2c1a }
{ "query_id": "q_8f2c1a", "count": 3, "credits_used": 3, "results": [ { "slug": "hubspot", "name": "HubSpot", "business_type": "saas", "category": "crm", "location": { "city": "Cambridge", "state": "MA", "country": "US" }, "contact": { "website": "https://hubspot.com" }, "completeness": 96, "confidence": 0.98, "last_verified": "2026-05-21T08:11:00Z" }, // salesforce, pipedrive⦠] }
Authentication #
All requests are authenticated with a Bearer token in the Authorization header. Keys are created in your dashboard and can be rotated at any time without downtime.
Key format
| Prefix | Type |
|---|---|
| vxi_live_ | Production key β counts against your monthly credits, returns real data. |
| vxi_test_ | Test key β 100 free calls/day, returns deterministic fixture ABOs. |
API Reference #
Five endpoints. All return JSON. All authenticated with the same Bearer token.
Search for businesses by query, location, and category. Returns ranked ABO matches with confidence scores.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| q | string | Required | Free-text search query. Business name, brand, or descriptive phrase. |
| location | string | optional | ISO-3166 country code. Examples: US, BR, GB. |
| business_type | string | optional | L1 category slug from /v1/categories. |
| limit | integer | optional | Max results. Free: 10, Starter: 25, Growth: 50. Default 10. |
| min_completeness | integer | optional | Minimum ABO completeness score, 0β100. Filters thin records. |
| wait Starter+ | boolean | optional | If true, blocks until any pending crawl completes (max 30s). |
Request
curl "https://api.getvexi.dev/v1/search" \ --data-urlencode "q=notion" \ --data-urlencode "location=US" \ --data-urlencode "business_type=saas" \ --data-urlencode "limit=25" \ -G -H "Authorization: Bearer $VEXI_KEY"
Response
βΈExpand response body
{ "query_id": "q_2d9f01", "count": 4, "credits_used": 3, "cache_hit": true, "results": [ { "slug": "notion", "name": "Notion", "business_type": "saas", "category": "project-management", "location": { "country": "US", "city": "San Francisco" }, "completeness": 94, "confidence": 0.97 } ] }
Response fields
| Field | Type | Description |
|---|---|---|
| query_id | string | Stable id for this search; usable for analytics and replay. |
| count | integer | Total matches before limit cap. |
| credits_used | integer | How many credits this call consumed. |
| cache_hit | boolean | true when served from the ABO cache. |
| results[] | ABO[] | Ranked array of Agent Business Objects. See ABO Schema. |
Retrieve a single ABO by its stable slug. Returns the full record including hours, social links, and verification metadata.
Parameters
| Parameter | Type | In | Description |
|---|---|---|---|
| slug | string | path | The ABO slug returned by search. |
| required_fields Starter+ | string[] | query | Comma-separated field paths. If any are missing, Vexi auto-crawls before responding. |
Request
curl "https://api.getvexi.dev/v1/business/hubspot?required_fields=offerings.pricing,trust.certifications" \ -H "Authorization: Bearer $VEXI_KEY"
Response
βΈExpand response body Β· ABO (full)
{ "slug": "hubspot", "schema_version": "1.0", "identity": { "name": "HubSpot", "legal_name": "HubSpot, Inc.", "founded_year": 2006, "category": "crm", "business_type": "saas", "description_short": "All-in-one CRM, marketing, and sales platform for scaling teams." }, "offerings": { "primary_offering": "Customer Platform (CRM + Marketing + Sales hubs)", "pricing": { "model": "freemium", "starting_from": "$0/mo", "free_tier": true } }, "location": { "is_remote": true, "is_international": true, "addresses": [{ "city": "Cambridge", "state": "MA", "country": "US", "is_headquarters": true }] }, "contact": { "website": "https://hubspot.com", "linkedin": "https://linkedin.com/company/hubspot" }, "trust": { "certifications": ["SOC 2 Type II", "ISO 27001", "GDPR"], "years_in_market": 20 }, "quality": { "completeness_score": 96, "confidence": "high" }, "generated_at": "2026-05-21T08:11:00Z" }
Returns the full Vexi business taxonomy. No parameters required. This call costs zero credits.
Response
{ "categories": [ { "id": "crm", "name": "crm", "display_name": "CRM", "parent_id": "saas", "usage_count": 38421 }, { "id": "project-management", "name": "project-management", "display_name": "Project Management", "parent_id": "saas", "usage_count": 27110 } ] }
Trigger a live crawl for a business URL. Returns immediately with a job id, or β when wait: true β blocks until the ABO is ready.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Required | Public URL of the business homepage. |
| wait | boolean | optional | Block until crawl completes (max 30s). Default false. |
Request
curl "https://api.getvexi.dev/v1/crawl" \ -X POST \ -H "Authorization: Bearer $VEXI_KEY" \ -H "Content-Type: application/json" \ -d '{"url":"https://hubspot.com","wait":false}'
Response
{ "status": "queued", "job_id": "job_01HXY24KMP9Z3", "eta_seconds": 14, "poll_url": "/v1/jobs/job_01HXY24KMP9Z3" }
Poll a crawl job for completion. Returns the final ABO once status is complete.
POST the completed ABO directly to your endpoint.MCP Server #
Vexi ships a native Model Context Protocol (MCP) server, letting any MCP-compatible agent β Claude, Cursor, Windsurf, or your own β query structured business data without writing a single line of API code.
MCP (Model Context Protocol) is an open standard that lets AI models call external tools in a structured, permission-safe way. When you connect Vexi's MCP server, your agent can search, look up, and crawl businesses as naturally as asking a question.
Setup
Pick your client. You'll need a vxi_live_ key from your dashboard and Node 18+ on your machine.
Claude Desktop
macOS Β· Windows Β· Linux
- 1Open Settings β Developer β Edit Config.
- 2Add the snippet below to
claude_desktop_config.json. - 3Restart Claude Desktop. Look for the π icon in the chat input.
Cursor
macOS Β· Windows Β· Linux
- 1Open Cursor Settings β MCP β Add new server.
- 2Name
Vexi, commandnpx -y @vexi/mcp, envVEXI_API_KEY=vxi_live_β¦. - 3Restart Cursor. Vexi tools appear in the agent panel.
claude_desktop_config.json
{ "mcpServers": { "vexi": { "command": "npx", "args": ["-y", "@vexi/mcp"], "env": { "VEXI_API_KEY": "vxi_live_β’β’β’β’β’β’β’β’" } } } }
Available Tools
Once connected, your agent has four typed tools available. Each maps 1:1 to a REST endpoint.
| Tool | Description | Key parameters |
|---|---|---|
| search_businesses | Search businesses by query and location. | query req Β· location Β· business_type Β· limit |
| get_business | Retrieve a full ABO by slug. | slug req Β· required_fields |
| crawl_business | Queue a new business for crawling. | url req Β· wait |
| list_categories | List all available business categories. | β |
Example
A real conversation with Claude Desktop, Vexi connected. The model picks the right tool, runs it, and reasons over typed ABOs:
ABO Schema #
An Agent Business Object (ABO) is Vexi's core data structure β a normalized, confidence-scored JSON document that describes everything an AI agent needs to know about a business.
Every ABO follows the same predictable schema, so your agent never needs to handle parsing logic for different sources. Fields are typed, nullable values are explicit, and a completeness_score tells you how much of the schema was populated.
{ "slug": "hubspot", "schema_version": "1.0", "generated_at": "2026-05-22T08:11:00Z", "source_url": "https://hubspot.com", "pages_scraped": 4, "identity": { β¦ core facts }, "offerings": { β¦ products & services }, "location": { β¦ physical & geographic }, "contact": { β¦ channels }, "trust": { β¦ credibility }, "operations": { β¦ service ops }, "agent_interface": { β¦ agent-ready CTAs }, "quality": { β¦ data quality } }
Fields Reference
Eight top-level objects. Each is independently populated and confidence-scored.
Core facts about the business β name, age, category, and a pair of agent-optimized descriptions.
"saas").Products and services the business provides.
name, description, category.name, description, price_range, category.{ model, starting_from, free_tier, pricing_url }.Physical and geographic presence.
{ street, city, state, country, zip, is_headquarters }.All contact channels β web, social, and direct.
Social proof and credibility signals.
{ platform, score, review_count }.Operational details for service businesses.
Structured data optimized for agent decision-making β actions, intents, and tags.
{ name, description, url, method } β CTAs the agent can take.Data quality metadata β never use a field without checking this.
Rate Limits & Credits #
Every call costs a small number of credits, deducted from your monthly bucket. Credits reset on the first of each calendar month, UTC.
Credit cost per operation
| Operation | Credits |
|---|---|
| GET /business (cache hit) | 1 |
| GET /categories | 0 |
| GET /search (cache hit) | 3 |
| GET /search (new crawl) | 10 |
| POST /crawl | 10 |
Plan limits
| Plan | Credits / month | Keys | Search results |
|---|---|---|---|
| Free ($0) | 500 | 1 | 10 |
| Starter ($49.90/mo) | 10,000 | 5 | 25 |
| Growth ($99.90/mo) | 20,000 | Unlimited | 50 |
Handling 429s
When you hit your limit, Vexi returns 429 Too Many Requests with a Retry-After header. Back off, then retry:
import time, requests def call_with_retry(url, headers, max_retries=5): for attempt in range(max_retries): r = requests.get(url, headers=headers) if r.status_code != 429: return r delay = int(r.headers.get("Retry-After", 2)) time.sleep(delay * (2 ** attempt)) raise RuntimeError("rate limited")
Error Handling #
Vexi uses standard HTTP status codes. Every error returns a JSON body with a stable code, a human-readable message, and a request_id you can quote when contacting support.
Error codes
| Code | Meaning |
|---|---|
| 400 | Bad request β malformed parameters or invalid body. |
| 401 | Invalid API key β missing, expired, or rotated. |
| 403 | Feature not available on your plan. |
| 404 | Business not found for that slug. |
| 429 | Rate limit exceeded β back off using Retry-After. |
| 500 | Server error β retry safe; surfaces in our status page. |
Error response shape
{ "error": { "code": "feature_not_available", "message": "The 'wait' parameter requires the Starter plan or higher.", "docs_url": "https://docs.getvexi.dev/errors/feature_not_available", "request_id": "req_01HXY27Q44LDC" } }
POST /crawl deduplicates by URL inside a 60-second window, so retries won't double-charge credits.