Skip to content

VendLead partners

Your listings, in front of operators ready to buy.

VendHub is opening to every vending operator, and they shop the VendLead directory for locations, routes and businesses. Connect your feed and each of your listings sends them straight to your site.

  • Free. No fee, no revenue share, no exclusivity.
  • One-minute sign-up. No contract, no call.
  • Every click lands on your listing page, tagged in your analytics.

Live now: 415 listings across 50 states, refreshed daily. See the directory

Connect your listings

Free. Your API key arrives by email.

What do you list?

No fee, no exclusivity. Disconnect any time.

Placement120 employees on site

Office vending location in Austin, TX

  • Venue Office
  • Machines 2
One-time$450via Your company
How your listing appears in the directory

Your name on every listing. Your link on every click.

  1. Your name on it. Cards read “via” your company, and each listing page says “Listed by” you with a link to your homepage.
  2. Found where operators search. Listings appear on the state, city and venue-type pages operators use to find leads.
  3. Buyers come to you. “View the original listing” opens your page with utm_source=vendhub, so you see every visit we send.

Three steps. No paperwork.

  1. Step 1 · 1 minute

    Sign up

    Fill in the form with an email at your own domain. Once we approve your site, your API key arrives there.

  2. Step 2 · One API call

    Send listings

    Post new, changed and removed listings from your system whenever they change.

  3. Step 3 · Every day

    Get buyers

    Listings appear on the pages operators browse, and every click lands on your site.

Questions partners ask

What does it cost?

Nothing. No fee, no revenue share, no exclusivity. Keep listing everywhere you list today.

Do you take my buyers?

No. We never show your seller contacts or full address. Operators click through to your listing page to buy, so the sale stays yours.

What shows up on VendHub?

Facts only: type, city and state, venue type, price. We write our own titles and never copy your descriptions or photos.

How do I remove a listing?

Send its id in “removed” and it comes down on the next update. Sold listings should always be removed.

Can you pull from our API or feed instead?

Yes. Send us a URL that returns your listings as JSON in the same fields, and we fetch it every hour. Anything missing from it comes down. Prefer webhooks? Point them at the same endpoint with your key.

We do not have a developer.

Sign up anyway and reply to your key email with a link to your listings page or a spreadsheet. We will help you get them in.

Who can connect?

Any site with real, current US vending listings it has the right to share. Partners who post junk or stale listings are disconnected.

For your developers

One endpoint. Send new, changed and removed listings whenever they change, from your code or as a webhook, up to 500 per request. One invalid listing rejects the whole request and nothing changes. Requests are safe to retry: sending the same listing again updates it.

Base URL
https://vendhub-website.vercel.app
Endpoint
POST /api/vendlead/partner-feed
Auth
Authorization: Bearer <your key>, sent by email once your site is approved
Check a key
GET the same URL: your company and how many of your listings are live
Test mode
Add ?dry_run=1: every check runs, nothing is published
Limits
500 listings and 1 MB per request, 120 requests an hour
curl -X POST https://vendhub-website.vercel.app/api/vendlead/partner-feed \
  -H "Authorization: Bearer $VENDLEAD_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "listings": [{
      "id": "12345",
      "url": "https://yoursite.com/listings/12345",
      "type": "location",
      "city": "Austin",
      "state": "TX",
      "property_type": "office",
      "price": 450,
      "price_period": "one_time"
    }],
    "removed": ["12001"]
  }'
200 {"ok": true, "stored": 1, "accepted": 1, "rejected": [], "stale": [], "removed": 1}
200 {"ok": true, "stored": 1, "accepted": 1, "rejected": [{"id": "12002", "error": "listings.1.state: must be a US state"}], "stale": [], "removed": 0}
400 {"ok": false, "error": "listings.0.state: must be a US state"}   (with ?atomic=1)

Rather we fetch? Give us a URL that returns {"listings": [...]} with the same fields and we pull it every hour; listings missing from it come down.

Listing fields
FieldNotes
idRequired. Your listing id. Sending it again updates the listing.
urlRequired. The listing page on your site (https, your domain). Buyers land here.
typeRequired. location, route, business_for_sale or machine.
state, cityUS state (code or name) and city. Or send lat and lng.
property_typeOptional. Venue type: office, gym, hotel, apartment and so on.
price, price_periodOptional. USD; one_time, monthly or negotiable.
annual_revenueOptional. Routes and businesses.
published_atOptional. When the listing went live on your site: 2026-10-01 or 2026-10-01T14:00:00Z.
statusOptional, new. active, pending, sold or withdrawn. Sold and withdrawn listings come down.
updated_atOptional, new. When you last changed the listing (2026-10-01T14:00:00Z). An update older than the last one we stored is ignored and listed in stale.
annual_cash_flowOptional, new. Yearly net. Must not be more than annual_revenue.
revenue_basisOptional, new. gross or net: what annual_revenue measures.
machine_count, location_countOptional, new. Whole numbers.
rights_basisOptional, new. owned, contract, verbal or none: what backs each placement.
mode (top level)Optional, new. delta (default) or full. Full means this request is your whole active set: your live listings missing from it come down.
Never sendphone, email, seller_name, address or business_name. A listing with any of them is rejected (contact_data_not_accepted).
Responses
StatusMeaning
200Applied (or, with ?dry_run=1, checked and nothing published). Listings that fail a check come back in rejected with the field named; the rest apply.
400Nothing applied: the request itself is malformed, or, with ?atomic=1, any listing failed. The error names the field, e.g. listings.3.url.
401Missing, wrong or suspended key.
413Body over 1 MB. Send fewer listings per request.
429Over 120 requests an hour. Batch up to 500 listings per request.
500Our side. Retry; repeating a request is safe.

Get your listings in front of buyers.

Get your API key