Scrape Facebook Marketplace Listings for B2C Lead Generation
TL;DR: Facebook Marketplace is a goldmine of behavioral signals — people listing furniture are often moving, people selling cars may be upgrading, and people posting "need help with X" are actively seeking services. As of May 2026, the SociaVault API lets you extract these signals programmatically and build lead generation pipelines for real estate, automotive, and service businesses.
Most people think of Facebook Marketplace as a place to buy and sell used goods. Savvy businesses see it differently: as a real-time feed of consumer intent signals. Someone listing a full apartment's worth of furniture isn't just selling furniture — they're probably moving. That's a lead for a real estate agent, a moving company, a storage facility, and a mortgage broker all at once.
This guide covers three high-value verticals and the code to extract leads from each.
The Core Insight: Listings as Intent Signals
| What They're Listing | What It Signals | Who Should Care |
|---|---|---|
| Furniture + appliances (bulk) | Moving / relocating | Real estate agents, movers, storage |
| Baby gear + nursery items | New parents / downsizing | Financial advisors, insurance agents |
| Exercise equipment | Lifestyle change | Personal trainers, nutrition coaches |
| Private car listings | Upgrading / financial need | Car dealers, auto lenders |
| "Need help with X" posts | Active service need | Contractors, cleaners, handymen |
| Musical instruments | Quitting lessons / moving | Music schools, pawn shops |
The SociaVault API gives you structured access to these signals at scale.
Setup
import requests
import time
import json
from datetime import datetime
API_KEY = 'YOUR_API_KEY'
BASE_URL = 'https://api.sociavault.com/v1/scrape/facebook-marketplace'
def get_location(city: str) -> dict:
resp = requests.get(
f'{BASE_URL}/location-search',
params={'query': city},
headers={'x-api-key': API_KEY}
)
return resp.json()['locations'][0]
def search_listings(query: str, lat: float, lng: float,
radius_km: int = 30) -> list:
resp = requests.get(
f'{BASE_URL}/search',
params={
'query': query,
'latitude': lat,
'longitude': lng,
'radius_km': radius_km
},
headers={'x-api-key': API_KEY}
)
return resp.json().get('listings', [])
Vertical 1: Real Estate Lead Generation
The Strategy
People selling large quantities of household items — furniture sets, appliances, full bedroom sets — are almost certainly moving. This is one of the strongest off-market real estate signals available.
Search for high-value furniture keywords, then look for listings that suggest a full household move rather than a single item sale.
MOVING_SIGNALS = [
'moving sale',
'everything must go',
'relocating',
'full bedroom set',
'entire living room',
'washer dryer set',
'kitchen appliances lot',
'moving out sale'
]
def find_moving_leads(city: str) -> list:
"""Find people who are likely moving based on their Marketplace listings."""
location = get_location(city)
lat, lng = location['latitude'], location['longitude']
all_leads = []
seen_sellers = set()
for keyword in MOVING_SIGNALS:
listings = search_listings(keyword, lat, lng)
for listing in listings:
seller_id = listing.get('seller_id')
if seller_id and seller_id not in seen_sellers:
seen_sellers.add(seller_id)
all_leads.append({
'seller_id': seller_id,
'signal_keyword': keyword,
'listing_title': listing['title'],
'listing_price': listing['price']['formatted_amount'],
'city': listing.get('location', {}).get('city', city),
'listing_url': f"https://www.facebook.com/marketplace/item/{listing['id']}",
'detected_at': datetime.utcnow().isoformat()
})
time.sleep(0.5)
return all_leads
# Run for your target market
leads = find_moving_leads('Atlanta, GA')
print(f"Found {len(leads)} potential moving leads")
# Export to JSON for CRM import
with open('real_estate_leads.json', 'w') as f:
json.dump(leads, f, indent=2)
Sample Output
[
{
"seller_id": "987654321",
"signal_keyword": "moving sale",
"listing_title": "Moving Sale - Entire 3BR Apartment Contents",
"listing_price": "$1,200",
"city": "Atlanta",
"listing_url": "https://www.facebook.com/marketplace/item/1234567890",
"detected_at": "2026-05-21T09:15:00Z"
}
]
Enrichment Step
Once you have seller profile URLs, you can visit their Marketplace profile to see all their active listings — a seller with 15+ items listed is a much stronger moving signal than someone selling a single couch.
Vertical 2: Automotive Lead Generation
The Strategy
Private car sellers on Marketplace are motivated sellers. They've already decided to sell — they just haven't found a buyer yet. Car dealers can use this data to:
- Identify motivated private sellers and make direct offers
- Track which makes/models are flooding the market (supply signal)
- Monitor pricing trends for trade-in valuations
CAR_QUERIES = [
'car for sale by owner',
'truck must sell',
'vehicle priced to sell',
'car need gone',
'selling my car'
]
def find_car_leads(city: str, price_max: int = 15000) -> list:
"""Find motivated private car sellers."""
location = get_location(city)
lat, lng = location['latitude'], location['longitude']
leads = []
seen_ids = set()
for query in CAR_QUERIES:
resp = requests.get(
f'{BASE_URL}/search',
params={
'query': query,
'latitude': lat,
'longitude': lng,
'radius_km': 50,
'price_max': price_max,
'category': 'vehicles'
},
headers={'x-api-key': API_KEY}
)
for listing in resp.json().get('listings', []):
if listing['id'] not in seen_ids:
seen_ids.add(listing['id'])
leads.append({
'listing_id': listing['id'],
'title': listing['title'],
'price': listing['price']['amount'],
'seller_id': listing.get('seller_id'),
'location': listing.get('location', {}),
'delivery_types': listing.get('delivery_types', []),
'listing_url': f"https://www.facebook.com/marketplace/item/{listing['id']}"
})
time.sleep(0.5)
# Sort by price (lowest first = most motivated sellers)
leads.sort(key=lambda x: x['price'])
return leads
car_leads = find_car_leads('Denver, CO', price_max=20000)
print(f"Found {len(car_leads)} car leads")
Enrich with Item Details
For the most promising leads, fetch full item details to get the description (which often contains contact info or urgency signals):
def enrich_car_lead(listing_id: str) -> dict:
"""Get full item details for a car listing."""
resp = requests.get(
f'{BASE_URL}/item',
params={'id': listing_id},
headers={'x-api-key': API_KEY}
)
item = resp.json()
# Extract condition and attributes
attrs = {a['label']: a['value'] for a in item.get('attributes', [])}
# Look for urgency signals in description
description = item.get('description', '').lower()
urgency_signals = ['must sell', 'moving', 'need gone', 'priced to sell',
'motivated', 'obo', 'best offer']
urgency_score = sum(1 for s in urgency_signals if s in description)
return {
**item,
'condition': attrs.get('Condition', 'Unknown'),
'mileage': attrs.get('Mileage', 'Unknown'),
'urgency_score': urgency_score,
'is_motivated_seller': urgency_score >= 2
}
Vertical 3: Service Business Lead Generation
The Strategy
People post "need help with X" listings on Marketplace all the time — plumbing issues, moving help, lawn care, cleaning services. These are warm leads: the person has already identified their need and is actively seeking a solution.
SERVICE_QUERIES = {
'plumbing': ['need plumber', 'plumbing help', 'pipe leak fix'],
'cleaning': ['need house cleaner', 'cleaning service needed', 'deep clean'],
'moving': ['need movers', 'moving help needed', 'help moving'],
'landscaping': ['lawn care needed', 'yard work help', 'tree removal'],
'handyman': ['handyman needed', 'home repair help', 'fix needed'],
'painting': ['painter needed', 'house painting', 'interior painting']
}
def find_service_leads(city: str, service_type: str) -> list:
"""Find people actively seeking a specific service."""
if service_type not in SERVICE_QUERIES:
raise ValueError(f"Unknown service type: {service_type}")
location = get_location(city)
lat, lng = location['latitude'], location['longitude']
leads = []
seen_ids = set()
for query in SERVICE_QUERIES[service_type]:
listings = search_listings(query, lat, lng, radius_km=25)
for listing in listings:
if listing['id'] not in seen_ids:
seen_ids.add(listing['id'])
leads.append({
'listing_id': listing['id'],
'title': listing['title'],
'service_type': service_type,
'matched_query': query,
'seller_id': listing.get('seller_id'),
'city': listing.get('location', {}).get('city', ''),
'listing_url': f"https://www.facebook.com/marketplace/item/{listing['id']}",
'found_at': datetime.utcnow().isoformat()
})
time.sleep(0.5)
return leads
# Example: find people needing movers in Chicago
moving_leads = find_service_leads('Chicago, IL', 'moving')
print(f"Found {len(moving_leads)} people needing moving services")
Building a Lead Scoring System
Not all leads are equal. Score them based on signal strength:
def score_lead(listing: dict, item_detail: dict = None) -> int:
"""Score a lead from 0-100 based on signal strength."""
score = 0
title = listing.get('title', '').lower()
description = (item_detail or {}).get('description', '').lower()
# High-urgency keywords
urgency_words = ['must sell', 'moving', 'relocating', 'need gone',
'priced to sell', 'motivated seller', 'obo']
score += sum(10 for w in urgency_words if w in title or w in description)
# Multiple items listed (moving signal)
if item_detail:
photo_count = len(item_detail.get('photos', []))
if photo_count >= 5:
score += 15 # Multiple photos = serious seller
# Delivery type (local pickup only = more motivated)
delivery = listing.get('delivery_types', [])
if delivery == ['local_pickup']:
score += 10
# Price relative to category average (below average = motivated)
# (You'd compare against your stored averages here)
return min(score, 100)
Filtering by Location Radius
For hyper-local service businesses, you want leads within a specific radius. Use the radius_km parameter:
# Tight radius for local service businesses (10km = ~6 miles)
local_leads = search_listings('need plumber', lat, lng, radius_km=10)
# Wider radius for dealers or agents (80km = ~50 miles)
regional_leads = search_listings('moving sale', lat, lng, radius_km=80)
Related Guides
- Facebook Marketplace API Reference — full endpoint docs
- Real Estate Investors Using Marketplace Data — deeper real estate use case
- Facebook Groups Buying Signals — complementary lead source
Frequently Asked Questions
Is it legal to use Marketplace data for lead generation?
Accessing publicly visible Marketplace listings is generally permissible. The data you're collecting — listing titles, prices, and public seller profiles — is visible to any unauthenticated user. Always comply with applicable privacy laws (GDPR, CCPA) when storing and using this data, and never use it for spam or harassment.
How do I filter listings by category?
Pass a category parameter to the search endpoint. Supported categories include vehicles, furniture, electronics, appliances, garden, and housing. Check the API docs for the full list.
Can I get the seller's phone number or email?
No. Facebook does not expose direct contact information through Marketplace listings. The API returns publicly visible seller profile data (name, profile URL, rating). To contact a seller, you'd need to message them through Facebook Messenger.
How do I avoid duplicate leads across multiple keyword searches?
Track seen seller_id values in a set, as shown in the code examples above. A seller listing multiple items will appear in multiple keyword searches — deduplicating by seller_id ensures you count them as one lead.
What's the best city size to target for lead generation?
Mid-size cities (500K–2M population) often have the best signal-to-noise ratio. Major metros have high listing volume but also more competition. Smaller cities have less noise but fewer leads. Test a few markets and measure your conversion rate.
Can I automate outreach to these leads?
You can export leads to a CRM and use your existing outreach tools. Do not use automated messaging bots to contact Marketplace sellers — this violates Facebook's terms and will get accounts flagged. Manual or semi-automated outreach through legitimate channels is the right approach.
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.