* Fix premature keyword filtering in Facebook marketplace scraping Addresses a critical bug where listings were incorrectly rejected during keyword filtering before their descriptions had been extracted from Facebook's detail pages. ## Problem The dual-check workflow was failing: 1. First check_listing() call: On search results with empty descriptions 2. Second check_listing() call: After get_listing_details() populates descriptions Listings with keywords only in descriptions were being rejected prematurely, causing false negatives for valid matches. ## Solution - Add description_available parameter to check_listing() to control filtering - Skip keyword filtering when descriptions haven't been fetched yet - Maintain antikeyword filtering on available text (title-only or title+description) - Add warning logs when description extraction fails ## Changes - facebook.py: Add description_available parameter and conditional filtering logic - monitor.py: Add defensive tuple unpacking for get_listing_details() return value - Add comprehensive test suite for keyword filtering edge cases - Fix minor formatting inconsistencies throughout codebase ## Testing - New test suite demonstrates the bug and validates the fix - Tests cover keyword filtering with/without descriptions - Antikeyword filtering verified to work correctly in all cases - All existing tests continue to pass Fixes: #247 * Apply minor code improvements from PR feedback - Remove redundant description_available=True parameter (uses default) - Move self.logger check to outer if condition to avoid nested checks These changes improve code clarity and efficiency.
An intelligent tool that monitors Facebook Marketplace listings using AI to help you find the best deals. Get instant notifications when items matching your criteria are posted, with AI-powered analysis of each listing.
Example notification from PushBullet:
Found 1 new gopro from facebook
[Great deal (5)] Go Pro hero 12
$180, Houston, TX
https://facebook.com/marketplace/item/1234567890
AI: Great deal; A well-priced, well-maintained camera meets all search criteria, with extra battery and charger.
Table of Contents:
- ✨ Key Features
- 🚀 Quick Start
- 💡 Example Usage
- 📚 Documentation
- 🤝 Contributing
- 📜 License
- 💬 Support
- 🙏 Credits
✨ Key Features
🔍 Smart Search
- Search multiple products using keywords
- Filter by price and location
- Exclude irrelevant results and spammers
- Support for different Facebook Marketplace layouts
🤖 AI-Powered
- Intelligent listing evaluation
- Smart recommendations
- Multiple AI service providers supported
- Self-hosted model option (Ollama)
📱 Notifications
- PushBullet, PushOver, Telegram, or Ntfy notifications
- HTML email notifications with images
- Customizable notification levels
- Repeated notification options
🌎 Location Support
- Multi-city search
- Pre-defined regions (USA, Canada, etc.)
- Customizable search radius
- Flexible seller location filtering
🚀 Quick Start
⚠️ Legal Notice: Facebook's EULA prohibits automated data collection without authorization. This tool was developed for personal, hobbyist use only. You are solely responsible for ensuring compliance with platform terms and applicable laws.
Installation
pip install ai-marketplace-monitor
playwright install
Basic Configuration
Create ~/.ai-marketplace-monitor/config.toml:
[marketplace.facebook]
search_city = 'houston' # Replace with your city
[item.gopro]
search_phrases = 'Go Pro Hero 11'
min_price = 100
max_price = 300
[user.me]
pushbullet_token = 'your_token_here' # Get from pushbullet.com
Run the Monitor
ai-marketplace-monitor
The program will open a browser, search Facebook Marketplace, and notify you of matching items.
💡 Example Usage
Find GoPro cameras under $300:
[item.gopro]
search_phrases = 'Go Pro Hero'
keywords = "('Go Pro' OR gopro) AND (11 OR 12 OR 13)"
min_price = 100
max_price = 300
Search nationwide with shipping:
[item.rare_item]
search_phrases = 'vintage collectible'
search_region = 'usa'
delivery_method = 'shipping'
seller_locations = []
AI-powered filtering:
[ai.openai]
api_key = 'your_openai_key'
[item.camera]
description = '''High-quality DSLR camera in good condition.
Exclude listings with water damage or missing parts.'''
rating = 4 # Only notify for 4+ star AI ratings
📚 Documentation
For detailed information on setup and advanced features, see the comprehensive documentation:
- 📖 Full Documentation - Complete guide and reference
- 🚀 Quick Start Guide - Get up and running in 10 minutes
- 🔍 Features Overview - Complete feature list
- 📱 Usage Guide - Command-line options and tips
- 🔧 Configuration Guide - Notifications, AI prompts, multi-location search
- ⚙️ Configuration Reference - Complete configuration reference
Key Topics Covered in Documentation
Notification Setup:
- Email (SMTP), PushBullet, PushOver, Telegram, Ntfy
- Multi-user configurations
- HTML email templates
AI Integration:
- OpenAI, DeepSeek, Ollama setup
- Custom prompt configuration
- Rating thresholds and filtering
Advanced Search:
- Multi-city and region search
- Currency conversion
- Keyword filtering with Boolean logic
- Proxy/anonymous searching
Configuration:
- TOML file structure
- Environment variables
- Multiple marketplace support
- Language/translation support
🤝 Contributing
Contributions are welcome! Here are some ways you can contribute:
- 🐛 Report bugs and issues
- 💡 Suggest new features
- 🔧 Submit pull requests
- 📚 Improve documentation
- 🏪 Add support for new marketplaces
- 🌍 Add support for new regions and languages
- 🤖 Add support for new AI providers
- 📱 Add new notification methods
Please read our Contributing Guidelines before submitting a Pull Request.
📜 License
This project is licensed under the Affero General Public License (AGPL). For the full terms and conditions, please refer to the official GNU AGPL v3.
💬 Support
We provide multiple ways to access support and contribute to AI Marketplace Monitor:
- 📖 Documentation - Comprehensive guides and instructions
- 🤝 Discussions - Community support and ideas
- 🐛 Issues - Bug reports and feature requests
- 💖 Become a sponsor - Support development
- 💰 Donate via PayPal - Alternative donation method
Important Note: Due to time constraints, priority support is provided to sponsors and donors. For general questions, please use the GitHub Discussions or Issues.
🙏 Credits
- Some of the code was copied from facebook-marketplace-scraper.
- Region definitions were copied from facebook-marketplace-nationwide, which is released under an MIT license as of Jan 2025.
- This package was created with Cookiecutter and the cookiecutter-modern-pypackage project template.

