Placement120 employees on siteOffice vending location in Austin, TX
- Venue Office
- Machines 2
VendLead partners
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.
Live now: 415 listings across 50 states, refreshed daily. See the directory
Placement120 employees on siteutm_source=vendhub, so you see every visit we send.Step 1 · 1 minute
Fill in the form with an email at your own domain. Once we approve your site, your API key arrives there.
Step 2 · One API call
Post new, changed and removed listings from your system whenever they change.
Step 3 · Every day
Listings appear on the pages operators browse, and every click lands on your site.
Nothing. No fee, no revenue share, no exclusivity. Keep listing everywhere you list today.
No. We never show your seller contacts or full address. Operators click through to your listing page to buy, so the sale stays yours.
Facts only: type, city and state, venue type, price. We write our own titles and never copy your descriptions or photos.
Send its id in “removed” and it comes down on the next update. Sold listings should always be removed.
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.
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.
Any site with real, current US vending listings it has the right to share. Partners who post junk or stale listings are disconnected.
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.
https://vendhub-website.vercel.appPOST /api/vendlead/partner-feedAuthorization: Bearer <your key>, sent by email once your site is approvedGET the same URL: your company and how many of your listings are live?dry_run=1: every check runs, nothing is publishedcurl -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.
| Field | Notes |
|---|---|
id | Required. Your listing id. Sending it again updates the listing. |
url | Required. The listing page on your site (https, your domain). Buyers land here. |
type | Required. location, route, business_for_sale or machine. |
state, city | US state (code or name) and city. Or send lat and lng. |
property_type | Optional. Venue type: office, gym, hotel, apartment and so on. |
price, price_period | Optional. USD; one_time, monthly or negotiable. |
annual_revenue | Optional. Routes and businesses. |
published_at | Optional. When the listing went live on your site: 2026-10-01 or 2026-10-01T14:00:00Z. |
status | Optional, new. active, pending, sold or withdrawn. Sold and withdrawn listings come down. |
updated_at | Optional, 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_flow | Optional, new. Yearly net. Must not be more than annual_revenue. |
revenue_basis | Optional, new. gross or net: what annual_revenue measures. |
machine_count, location_count | Optional, new. Whole numbers. |
rights_basis | Optional, 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 send | phone, email, seller_name, address or business_name. A listing with any of them is rejected (contact_data_not_accepted). |
| Status | Meaning |
|---|---|
200 | Applied (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. |
400 | Nothing applied: the request itself is malformed, or, with ?atomic=1, any listing failed. The error names the field, e.g. listings.3.url. |
401 | Missing, wrong or suspended key. |
413 | Body over 1 MB. Send fewer listings per request. |
429 | Over 120 requests an hour. Batch up to 500 listings per request. |
500 | Our side. Retry; repeating a request is safe. |