Vendora Developers
Developer API · v2

Build with the Vendora Vendor Network

Search thousands of pre-vetted, licensed and insured service vendors by location. Pass any address fragment + a radius and get ranked results instantly.

Address-aware search

Pass any address fragment — street, city, zip, or partial — and a radius in miles. We geocode it and return vendors sorted by proximity.

Pre-vetted vendors

Every vendor in the network is scored A–F based on licensing, insurance, BBB rating, reviews, and years in business.

Simple REST API

One endpoint, standard JSON, bearer token auth. Works with any language. Get results in under 500ms.

Quick example

Request

GET /v2/vendors?address=123+Main+St+Newark+NJ&query=faucet&radius=25&limit=5 Authorization: Bearer vnd_your_key

Response

{ "total": 42, "page": 1, "radius_miles": 25, "search_center": { "lat": 40.7357, "lng": -74.1724 }, "vendors": [{ "vendor_id": "3fa85f64-…", "canonical_name": "Joe's Plumbing", "score_tier": "A", "distance_miles": 3.2, "is_licensed": true, "primary_phone": "+19735551234" }] }

No account?

Already have an account?

API Keys

Up to 5 active keys per account

Loading…

Find Vendors

Search the vendor network by address and optional category or keyword. Select up to 10 vendors, then click Get Quotes — Vendora sends a push notification to onboarded partners and an AI phone call (via VAPI) to non-onboarded vendors.

Sent directly to the API — never logged by this page.

Search Parameters

0 selected

Get Quotes for Selected Vendors

API Reference

Vendora v2 — find and contact local vendors from any application.

Authentication GET /v2/vendors Response Schema Vendor Object POST /v2/vendors Score Tiers Code Examples Errors

Base URL

http://45.77.79.14

All endpoints are under /v2/. All responses use JSON.

Authentication

Every request must include your API key as a Bearer token in the Authorization header.

Authorization: Bearer vnd_your_api_key_here

Create and manage your keys in the API Keys tab. Each key is shown only once at creation — store it securely.

GET /v2/vendors Search vendors by location

Search the vendor network by address and radius. Geocodes the address and returns vendors sorted by distance, then score. Use description to search by plain-English problem description (AI-classified), or query to keyword-search by vendor name.

Query Parameters

Parameter Type Required Default Description
address string Yes — Property address geocoded to find nearby vendors. City + state or full street address. e.g. "123 Main St Newark NJ 07102"
category string No — Filter by category code prefix. e.g. PLB returns all plumbing subcategories; PLB.GEN is exact.
query string No — Keyword search on vendor name (case-insensitive). Alias: q.
radius number No 25 Search radius in miles. Range: 1–200.
limit number No 12 Results per page. Range: 1–50.
page number No 1 Page number for pagination.

Response — GET /v2/vendors

{ "total": 47, // total vendors matched in radius "page": 1, "limit": 12, "radius_miles": 25, "search_center": { "lat": 40.7357, "lng": -74.1724, "formatted_address": "123 Main St, Newark, NJ, USA" }, "vendors": [ /* vendor objects — see below */ ] }

Vendor Object

{ "vendor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "canonical_name": "Joe's Plumbing LLC", "primary_category_code": "PLB.GEN", "category_display_name": "General Plumbing", "score_tier": "A", // A/B/C/D/F or null "vendor_score": 84.5, // 0–100 composite score "is_licensed": true, "is_insured": true, "is_onboarded": false, // onboarded = registered Vendora partner "primary_phone": "+19735551234", // E.164 format, or null "website_url": "https://joesplumbing.com", "city": "Newark", "state": "NJ", "zip": "07102", "distance_miles": 3.2, // null if address could not be geocoded "avg_rating": 4.7, // 1–5, or null "total_review_count": 52, "years_in_business": 12 // or null }
POST /v2/vendors Request quotes from specific vendors

Contact a list of vendors by vendor_id and trigger outreach automatically. Onboarded Vendora partners receive a push notification to the Vendora app. Non-onboarded vendors receive an AI outbound phone call via VAPI. Your calling program sends the same request regardless — Vendora routes it based on each vendor's onboarding status.

Request Body (JSON)

Field Type Required Default Description
get_quotes boolean Yes — Must be true.
vendor_ids string[] Yes — Array of vendor UUIDs to contact. Max 10. Use GET /v2/vendors to find IDs.
address string Yes — Property address where work is needed.
query string Yes — Plain-English job description. Used in VAPI call script for non-onboarded vendors. e.g. "kitchen faucet dripping constantly"
category string No — Category code to tag this quote request. e.g. PLB.GEN
budget_low number No — Budget range minimum (USD).
budget_high number No — Budget range maximum (USD).
reference_id string No — Your internal ID for this request — echoed back as external_reference_id in the response.
urgency string No "normal" normal · urgent · scheduled
property_type string No "apartment" Property type passed to the vendor call script.

Response

{ "quote_request_id": "uuid", // Vendora tracking ID "external_reference_id": "your-id", // echoes your reference_id "category": "General Plumbing", "vendors_contacted": 3, "vendors_called": 2, // non-onboarded → VAPI call "vendors_notified": 1, // onboarded → push notification "vendors": [ { "vendor_id": "uuid", "name": "Joe's Plumbing LLC", "type": "call", // "call" | "onboarded" "status": "initiated", // see statuses below "phone": "+19735551234" // present for "call" type } ] }

Vendor Result Statuses

Status Type Meaning
initiatedcallVAPI outbound call successfully dispatched to non-onboarded vendor
bid_requestedonboardedPush notification sent to onboarded vendor's Vendora app
skippedcallVendor skipped — unparseable or missing phone number
failedcallVAPI call rejected (see error field)
erroranyUnexpected error during contact attempt

Category Codes

Pass a category code in the category parameter to filter search results or tag a quote request. Prefix matching is supported — PLB matches all plumbing subcategories.

PLB.GEN — General Plumbing PLB.DRN — Drain & Rooter PLB.WHR — Water Heater PLB.EMR — Emergency Plumbing ELC.GEN — General Electrical ELC.LTG — Lighting ELC.PNL — Panel / Breaker HVA.AC — Air Conditioning HVA.HTG — Heating / Furnace APP.GEN — Appliance Repair CPT.GEN — Carpentry / Drywall LCK.GEN — Locksmith ROF.GEN — Roofing PNT.GEN — Painting FLR.GEN — Flooring GEN.HDY — General Handyman

Full category list is available on request. Unrecognized descriptions fall back to GEN.HDY.

Vendor Score & Tiers

Each vendor receives a composite Vendora Score (0–100) based on licensing status, insurance, BBB accreditation, years in business, and customer reviews. The score maps to a letter tier.

A · 80–100Excellent — licensed, insured, high reviews, long track record
B · 65–79Good — meets most quality criteria
C · 50–64Average — some gaps in credentials or reviews
D · 35–49Below average — limited verifiable information
F · 0–34Poor — not recommended

Code Examples

Search vendors (GET)

curl -G http://45.77.79.14/v2/vendors \ -H "Authorization: Bearer vnd_your_api_key_here" \ --data-urlencode "address=123 Main St Newark NJ 07102" \ -d "category=PLB.GEN&radius=25&limit=10"

Request quotes from specific vendors (POST)

curl -X POST http://45.77.79.14/v2/vendors \ -H "Authorization: Bearer vnd_your_api_key_here" \ -H "Content-Type: application/json" \ -d '{ "get_quotes": true, "vendor_ids": ["uuid-1", "uuid-2", "uuid-3"], "address": "123 Main St Newark NJ 07102", "query": "kitchen faucet is dripping constantly", "category": "PLB.GEN", "reference_id": "your-internal-id-123", "urgency": "normal" }'

Search vendors (GET)

const params = new URLSearchParams({ address: '123 Main St Newark NJ 07102', category: 'PLB.GEN', radius: 25, limit: 10, }); const res = await fetch(`http://45.77.79.14/v2/vendors?${params}`, { headers: { 'Authorization': 'Bearer vnd_your_api_key_here' }, }); const { vendors, total } = await res.json(); console.log(`${total} vendors found`); vendors.forEach(v => console.log(v.canonical_name, v.distance_miles + ' mi', v.vendor_id));

Request quotes from specific vendors (POST)

const res = await fetch('http://45.77.79.14/v2/vendors', { method: 'POST', headers: { 'Authorization': 'Bearer vnd_your_api_key_here', 'Content-Type': 'application/json', }, body: JSON.stringify({ get_quotes: true, vendor_ids: ['uuid-1', 'uuid-2', 'uuid-3'], address: '123 Main St Newark NJ 07102', query: 'kitchen faucet is dripping constantly', category: 'PLB.GEN', reference_id: 'your-internal-id-123', urgency: 'normal', }), }); const { vendors_called, vendors_notified, vendors, quote_request_id } = await res.json(); console.log(`Called: ${vendors_called}, Push-notified: ${vendors_notified}`); vendors.forEach(v => console.log(v.name, v.type, v.status));

Search vendors (GET)

import requests VENDORA_KEY = "vnd_your_api_key_here" BASE = "http://45.77.79.14" HEADERS = { "Authorization": f"Bearer {VENDORA_KEY}" } resp = requests.get( f"{BASE}/v2/vendors", params={ "address": "123 Main St Newark NJ 07102", "category": "PLB.GEN", "radius": 25, "limit": 10, }, headers=HEADERS, ) data = resp.json() print(f"Found {data['total']} vendors") for v in data["vendors"]: print(f" {v['canonical_name']} — {v['distance_miles']} mi ({v['score_tier']}) id={v['vendor_id']}")

Request quotes (POST)

resp = requests.post( f"{BASE}/v2/vendors", json={ "get_quotes": True, "vendor_ids": ["uuid-1", "uuid-2"], "address": "123 Main St Newark NJ 07102", "query": "kitchen faucet is dripping constantly", "category": "PLB.GEN", "reference_id": "your-internal-id-123", }, headers={**HEADERS, "Content-Type": "application/json"}, ) data = resp.json() print(f"Called: {data['vendors_called']}, Push-notified: {data['vendors_notified']}") for r in data["vendors"]: print(f" {r['name']} ({r['type']}) → {r['status']}")

HTTP Status Codes

Code Meaning Common Cause
200 OK Request succeeded
400 Bad Request Missing required field or invalid value. GET: address required. POST: get_quotes, vendor_ids, address, query required.
401 Unauthorized Missing, invalid, or revoked API key
500 Server Error Unexpected error — the response body contains an error field with details
// Error response shape { "error": "description is required" }

Limits

• 5 API keys per developer account

• 50 vendors max returned per request

• 200 miles max search radius

• 10 vendor IDs max in vendor_ids

• 24-hour cooldown per vendor — prevents duplicate quote requests

• Please keep requests under 10 per second. Rate limiting will be enforced in a future release.

API Key Created

Copy it now — you won't see it again.

Store this key securely. It cannot be retrieved after closing this dialog.

New API Key