An AI-based tool for monitoring Facebook Marketplace. With the aids from AI, this tool automates the process of searching for specific products, filtering out irrelevant listings, and notifying you of new matches via PushBullet.
- Overview
- Table of content:
- Features
- Quickstart
- Configuration Guide
- Advanced features
- TODO List:
- Credits
- Search for one or more products using specified keywords.
- Limit search by price, and location.
- Exclude irrelevant results and spammers.
- Use an AI service provider (OpenAI or DeepSeek) to confirm listing matches.
- Send notifications via PushBullet.
- Search repeatedly with specified intervals.
- Search multiple cities, even pre-defined regions (e.g. USA)
- Python 3.x installed.
Install the program by
pip install ai-marketplace-monitor
Install a browser for Playwright using the command:
playwright install
- Sign up for PushBullet
- Install the app on your phone
- Go to the PushBullet website and obtain a token
If you would like to use the OpenAI AI assistant,
- Sign up for a pro account of open AI
- Go to the API keys section of your profile, generate a new API key, and copy it
If you would like to use the DeepSeek AI assistant,
- Sign up for a deepseek account
- Generate an API key from the API keys section and copy it
One or more configuration file in TOML format is needed. The following example (minimal_config.toml
) shows the absolute minimal number of options, namely which city you are searching in, what item you are searching for, and how you get notified with matching listings.
[marketplace.facebook]
search_city = 'houston'
[item.name]
keywords = 'Go Pro Hero 11'
[user.user1]
pushbullet_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
The configuration file needs to be put as $HOME/.ai-marketplace-monitor/config.toml
, or be specified via option --config
.
A more realistic example using openAI would be
[ai.openai]
api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
[marketplace.facebook]
search_city = 'houston'
username = '[email protected]'
seller_locations = [
"sugar land",
"stafford",
"missouri city",
"pearland"
]
[item.name]
keywords = 'Go Pro Hero 11'
description = '''A new or used Go Pro version 11, 12 or 13 in
good condition. No other brand of camera is acceptable.
Please exclude sellers who offers shipping or asks to
purchase the item from his website.'''
min_price = 100
max_price = 200
[item.name2]
keywords = 'something rare'
description = '''A rare item that has to be searched nationwide and be shipped.
listings from any location are acceptable.'''
search_region = 'usa'
delivery_method = 'shipping'
seller_locations = []
[user.user1]
pushbullet_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ai-marketplace-monitor
or use option --config
for a non-standard configuration file. The terminal output will look similar to
NOTE
- You need to keep the terminal running to allow the program to run indefinitely.
- You will see a browser firing up. You may need to manually enter username and/or password (if unspecified in config file), and answer any prompt (e.g. CAPTCHA) to login. You may want to click "OK" to save the password, etc.
- If you continue to experience login problem, it can be helpful to remove
username
andpassword
frommarketplace.facebook
to authenticate manually. You may want to setlogin_wait_time
to be larger than 60 if you need more time to solve the CAPTCHA.
It is recommended that you check the log messages and make sure that it includes and excluded listings as expected. Modify the configuration file to update search criteria if needed. The program will detect changes and restart the search automatically.
Here is a complete list of options that are acceptable by the program. example_config.toml
provides
an example with many of the options.
One of more sections to list the AI agent that can be used to judge if listings match your selection criteria. The options should have header such as [ai.openai]
or [ai.deepseek]
, and have the following keys:
provider
: (optional), the section name will be used if this is unspecified, soai.deepseek
will assume a provider ofdeepseek
.api-key
: (required), a program token to access openAI REST API.base_url
: (optional), in case you use another servermodel
: (optional), by defaultgpt-4o
ordeepseek-chat
will be used forOpenami
orDeepSeek
respectively.
Note that:
provider
can be Open AI or DeepSeek. However, with the use ofbase_url
,model
, andapi-key
, you can use this program with any services that provides anOpenAI
-compatible API.- If more than one
ai
sections are provided, the program will try all of them in the order for which they are specified.
One or more sections marketplace.name
show the options for interacting with the facebook marketplace.
market_type
: (optional),facebook
is currently the only supported marketplace.username
: (optional), you can enter manually or keep in config filepassword
: (optional), you can enter manually or keep in config filelogin_wait_time
: (optional), time to wait before searching in seconds, to give you enough time to enter CAPTCHA, default to 60.- Common options listed in the section Common options below. These options, if specified in the marketplace section, will by default be applied to all items.
Because the default marketplace
for all items are facebook
, you will most likely have a single section called marketplace.facebook
.
One or more user.username
sections are allowed. The username
need to match what are listed by option notify
of marketplace or items. PushBullet is currently the only method of notification.
pushbullet_token
: (rquired) token for user
One or more item.item_name
where item_name
is the name of the item.
keywords
: (required) one of more keywords for searching the item.description
: (optional) A longer description of the item that better describes your requirements, such as manufacture, condition, location, seller reputation, if you accept shipping etc. It is currently only used if AI assistance is enabled.enabled
: (optional), stop searching this item if set tofalse
include_keywords
: (optional), exclude listings that does not contain any of the keywords.exclude_keywords
: (optional), exclude listings whose titles contain any of the specified wordsexclude_by_description
: (optional) exclude items with descriptions containing any of the specified words.marketplace
: (optional), can only befacebook
if specified.- Common options listed below. These options, if specified in the item section, will override options in the markerplace section.
Facebook may return listings that are completely unrelated to search keywords, but can also return related items under different names. To fix this problem, you can
- Use
include_keywords
to keep only items with certain words in the title. For example, you can setinclude_keywords = ['gopro', 'go pro']
when you search forkeywords = 'gopro'
. - Use
exclude_keywords
to narrow down the search. For example, settingexclude_keywords=['HERO 4']
will exclude items withHERO 4
orhero 4
in the title. - It is usually more effective to write a longer
description
and let the AI know what exactly you want. This will make sure that you will not get a drone when you are looking for a camera.
The following options that can specified for both marketplace
sections and item
sections. Options defined in marketplaces provide default options for all items searched in that marketplace. Options defined for individual items will override options provided in marketplaces.
-
seller_locations
: (optional) only allow searched items from these locations -
condition
: (optional) one or more ofnew
,used_like_new
,used_good
, andused_fair
. -
date_listed
: (optional) one ofAll
,Last 24 hours
,Last 7 days
,Last 30 days
, or0
,1
,7
, and30
. -
delivery_method
: (optional) one ofall
,local_pick_up
, andshipping
. -
exclude_sellers
: (optional) exclude certain sellers by their names (not username) -
min_price
: (optional) minimum price. -
max_price
: (optional) maximum price. -
notify
: (optional) users who should be notified -
radius
: (optional) radius of search, can be a list if multiplesearch_city
are specified. -
search_city
: (required for marketplace or item ifsearch_region
is unspecified) one or more search city, which can be obtained from the URL of your search query. -
search_region
: (optional) search over multiple locations to cover an entire region.regions
should be one or more pre-defined regions, or regions defined in the configuration file. -
search_interval
: (optional) minimal interval in seconds between searches, you can also write human friendly strings like1d
,5h
, or1h 30m
. -
max_search_interval
: (optional) maximum interval in seconds between searches, if specified, a random time will be chosen betweensearch_interval
andmax_search_interval
. -
start_at
: (optional) time to start the search. It currently supportHH:MM:SS
orHH:MM
for every day atHH:MM:SS
orHH:MM:00
*:MM:SS
or*:MM
for every hour atMM:SS
orMM:00
,*:*:SS
for every minute atSS
.
If specified, this option will override
search_interval
.
Note that
exclude_keywords
andexclude_by_description
will lead to string-based exclusion of items. If AI assistant is available, it is recommended that you specify these exclusion items verbally indescription
, such as "exclude items that refer me to a website for purchasing, and exclude items that only offers shipping.".- If
notify
is not specified for bothitem
andmarketplace
, all listed users will be notified.
One or more sections of [region.region_name]
, which defines regions to search. Multiple searches will be performed for multiple cities to cover entire regions.
search_city
: (required), one or more cities with names used by facebookfull_name
: (optional) a display name for the region.radius
: (optional), recommend 805 for regions using miles, and 500 using kms, default to805
city_name
: (optional), corresponding city names for bookkeeping purpose only.
Note that
-
Under the hood, ai-marketplace-monitor will simply set
radius
and expand regions intosearch_city
of marketplace or items withsearch_region
. Optionsfull_name
andcity_name
are not used. -
If you are searching one or more regions by specifying
search_region
, make sure that you setseller_locations=[]
or leave it unspecified in bothitem
andmarketplace.facebook
. -
ai-marketplace-monitor ships with the following regions:
usa
for USA (without AK or HI)usa_full
for USAcan
for Canadamex
for Mexicobra
for Brazilarg
for Argentinaaus
for Australiaaus_miles
for Australia using 500 miles radiusnzl
for New Zealandind
for Indiagbr
for United Kingdomfra
for Francespa
for Spain
These regions are defined in the system config.toml. You can define your own regions following the style there. Please feel free to submit PRs to add regions that can be of interest to others.
You can use multiple configuration files. For example, you can add all credentials to ~/.ai-marketplace-monitor/config.yml
and use separate configuration files for items for different users.
If you ever wonder why a listing was excluded, or just want to check a listing against your configuration, you can get the URL (or the item ID) of the listing, and run
ai-marketplace-monitor --check your-url
If you have multiple items specified in your config file, ai-marketplace-monitor will check the product against the configuration of all of them. If you know the name of the item in your config file, you can let the program only check the configuration of this particular item.
ai-marketplace-monitor --check your-url --for item_name
Option --check
will load the details of the item from the cache if it was previously examined. Otherwise a browser will be started to retrieve the page.
Although facebook is currently the only supported marketplace, you can create multiple marketplaces such asmarketplace.city1
and marketplace.city2
with different options such as search_city
, search_region
, seller_locations
, and notify
. You will need to add options like marketplace='city1'
in the items section to link these items to the right marketplace.
For example
[marketplace.facebook]
search_city = 'houston'
seller_locations = ['houston', 'sugarland']
[marketplace.nationwide]
search_region = 'usa'
seller_location = []
delivery_method = 'shipping'
[item.default_item]
keywords = 'local item for default market "facebook"'
[item.rare_item1]
marketplace = 'nationwide'
keywords = 'rare item1'
[item.rare_item2]
marketplace = 'nationwide'
keywords = 'rare item2'
Sometimes you may see error messages such as No price was found for item.... The exact reason is unknown, but you could try to use
ai-marketplace-monitor --disable-javascript
You will no longer see the pages but the script could work better.
- Support more AI engines
- Develop better ways to identify spammers
- Support more notification methods.
- Support more marketplaces such as NextDoor and Craigslist
The structure of this project makes it relatively easy to support more notification methods, AI engines, and marketplaces, but I will mostly rely on PRs to add these features.
- 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.