Important
If you are multi-accounting and abusing the service for which this is intended - DO NOT COMPLAIN ABOUT BANS!!!
Caution
Use it at your own risk, M$ may ban your account (and I would not be responsible for it).
Based on signals from the community, the following practices appear to reduce ban risk:
- Do not run more than one account at a time.
- Do not use more than one phone number per 5 accounts.
- Do not redeem more than one reward per day.
- Originally created by @charlesbel as Microsoft-Rewards-Farmer.
- Forked and significantly refactored/maintained by @klept0 as MS-Rewards-Farmer, with contributions from a community of volunteers.
- The @klept0 fork was archived in January 2026. At that point, the upstream
masterbranch was non-functional, and thedevelopbranch was in a better state but still not fully working. This repository was created in February 2026 to continue the project, incorporating a series of fixes and improvements that had been developed independently to overcome the limitations of the upstream version. - As of March 2026, this fork is in a working state. It has been tested for over 2 weeks with consistent results. The script may occasionally fail due to browser timeouts or transient issues -- running it in a loop with a short delay (e.g. 5 minutes) between executions works well in practice.
- In July 2026, Microsoft rolled out a major redesign of the Rewards page, breaking this automation. The new Rewards experience is a React single-page application with a substantially different DOM structure, rendering the existing Selenium selectors ineffective. Additionally, Microsoft appears to have reduced the total number of points earnable per day, which has drawn widespread complaints from the Rewards community on Reddit and similar platforms. Mobile search points also appear to no longer be collectable through browser automation. Work is underway to adapt the code to the new page structure.
- After testing a new version of the script with the new version of the Microsoft Rewards page we merged the experimental branch to main.
This project uses uv for dependency management.
-
Install dependencies:
uv sync --no-dev
For development (includes dev dependencies):
uv sync
-
Make sure you have Chrome installed.
-
(Windows Only) Make sure Visual C++ redistributable DLLs are installed.
If they're not, install the current "vc_redist.exe" from this link and reboot your computer.
-
Generate a configuration file:
uv run python main.py -C
-
Open the generated
config.yamlfile and edit it with your information.The generated config contains sensible defaults that have been proven working in testing. You should only need to fill in your account credentials.
[!WARNING] The
browser.languagesetting must been-US. Changing it to a different language will break the login flow, as some steps rely on English labels in the absence of better selectors. You can changebrowser.geolocationto your country code.The
totpfield is not mandatory, only enter your TOTP key if you use it for 2FA (if omitting, don't keep it as an empty string, remove the line completely).The
proxyfield is not mandatory, you can omit it if you don't want to use proxy (don't keep it as an empty string, remove the line completely).You can add or remove accounts according to your will.
-
Run the script:
uv run python main.py
(Windows Only) You can also run the script wrapper that will detect your python installation and re-run the script if it crashes using
.\run.ps1(.\run.ps1 -helpfor more information). To allow script execution without confirmation, use the following command:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser. -
(Windows Only) You can set up automatic execution with Windows Task Scheduler.
Run the
register_task.ps1script from an elevated (Administrator) PowerShell in the repository root. It creates the scheduled task directly -- no manual import step:.\register_task.ps1
By default the task runs
run.ps1daily at 03:00. You can override the time, task name, account, or retry count:.\register_task.ps1 -RunAt "07:30" -Retries 5
To run the script as soon as the computer is on instead of at a fixed time, use
-Schedule Startup:.\register_task.ps1 -Schedule StartupThe startup trigger waits a short delay (default
-StartupDelay PT5M, i.e. 5 minutes) so the network is up before the run.[!CAUTION] Use a single trigger (
DailyorStartup, not both). Two runs in close succession have no mutual exclusion and would overload the Microsoft endpoints, which can get the activity flagged as suspicious.The script registers the task to run whether or not you are logged on, so it will prompt for your Windows password (required by Windows to store the credentials). Re-running the script updates the existing task in place.
Advanced:
-TargetScript <path>launches a different wrapper instead ofrun.ps1, and-RunLevel Highestregisters the task elevated (only needed if your wrapper requires admin;run.ps1does not).[!NOTE] Because a logged-off task runs in a non-interactive session, keep MS-Rewards-Farmer in headless mode (
browser.visible: false, the default). Visible-mode runs require an interactive logon and will not work from a logged-off scheduled task.To remove the task later:
Unregister-ScheduledTask -TaskName "MS-Rewards-Farmer" -Confirm:$false
All the variable listed here can be added to you config.yaml configuration file, and the values represented here show
the default ones, if not said otherwise.
Caution
Please don't use this as your configuration. It's an example to show configuration possibilities, not the best configuration for you. Doing so will only prevent default values from being used, and it'll result in preventing updates (such as ignored activities). You should only add a variable to your configuration file if you want to change it.
Note
search.type is replaced with independent channel switches. Remove any existing
search: section and use channel.desktop.enabled and
channel.mobile.enabled instead.
# config.yaml
apprise: # 'apprise' is the name of the service used for notifications https://github.com/caronc/apprise
enabled: true # set it to false to disable apprise globally, can be overridden with command-line arguments.
notify:
incomplete-activity: true # set it to false to disable notifications for incomplete activities
uncaught-exception: true # set it to false to disable notifications for uncaught exceptions
login-code: true # set it to false to disable notifications for the temporary M$ Authenticator login code
summary: ON_ERROR # set it to ALWAYS to always receive a summary about your points progression or errors, or to
# NEVER to never receive a summary, even in case of an error.
urls: # add apprise urls here to receive notifications on the specified services :
# https://github.com/caronc/apprise#supported-notifications
# Empty by default.
- discord://{WebhookID}/{WebhookToken} # Exemple url
browser:
geolocation: US # Replace with your country code https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2.
# Detected by default, can be overridden with command-line arguments.
language: en-US # Replace with your language code https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes.
# Detected by default, can be overridden with command-line arguments.
visible: false # set it to true to show the browser window, can be overridden with command-line arguments.
proxy: null # set the global proxy using the 'http://user:pass@host:port' syntax.
# Override per-account proxies. Can be overridden with command-line arguments.
logging:
level: INFO # Set to DEBUG, WARNING, ERROR or CRITICAL to change the level of displayed information in the terminal
# See https://docs.python.org/3/library/logging.html#logging-levels. Can be overridden with command-line arguments.
retries:
backoff-factor: 120 # The base wait time between each retries. Multiplied by two each try.
max: 4 # The maximal number of retries to do
strategy: EXPONENTIAL # Set it to CONSTANT to use the same delay between each retries.
# Else, increase it exponentially each time.
cooldown:
min: 300 # The minimal wait time between two searches/activities
max: 600 # The maximal wait time between two searches/activities
channel:
desktop:
enabled: true # Complete dashboard activities and desktop Bing searches.
mobile:
enabled: true # Complete Read to Earn. Mobile Bing searches are not performed.
accounts: # The accounts to use. You can put zero, one or an infinite number of accounts here.
# Empty by default, can be overridden with command-line arguments.
- email: Your Email 1 # replace with your email
password: Your Password 1 # replace with your password
totp: 0123 4567 89ab cdef # replace with your totp, or remove it
proxy: http://user:pass@host1:port # replace with your account proxy, or remove it
- email: Your Email 2 # replace with your email
password: Your Password 2 # replace with your password
totp: 0123 4567 89ab cdef # replace with your totp, or remove it
proxy: http://user:pass@host2:port # replace with your account proxy, or remove itusage: main.py [-h] [-c CONFIG] [-C] [-v] [-l LANG] [-g GEO] [-em EMAIL] [-pw PASSWORD]
[-totp TOTP] [-p PROXY] [--desktop-channel | --no-desktop-channel]
[--mobile-channel | --no-mobile-channel] [-da] [-d] [-r]
A simple bot that uses Selenium to farm M$ Rewards in Python
options:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
Specify the configuration file path
-C, --create-config Create a fillable configuration file with basic settings and given
ones if none exists
-v, --visible Visible browser (Disable headless mode)
-l LANG, --lang LANG Language (ex: en) see https://serpapi.com/google-languages for options
-g GEO, --geo GEO Searching geolocation (ex: US) see https://serpapi.com/google-trends-
locations for options (should be uppercase)
-em EMAIL, --email EMAIL
Email address of the account to run. Only used if a password is given.
-pw PASSWORD, --password PASSWORD
Password of the account to run. Only used if an email is given.
-totp TOTP, --totp TOTP
TOTP secret for 2FA. Only used if email and password are given.
-p PROXY, --proxy PROXY
Global Proxy, supports http/https/socks4/socks5 (overrides config per-
account proxies) `(ex: http://user:pass@host:port)`
--desktop-channel, --no-desktop-channel
Enable or disable the desktop channel
--mobile-channel, --no-mobile-channel
Enable or disable the mobile Read-to-Earn channel
-da, --disable-apprise
Disable Apprise notifications, useful when developing
-d, --debug Set the logging level to DEBUG
-r, --reset Delete the session folder and temporary files and kill all chrome
processes. Can help resolve issues.
At least one account should be specified, either using command line arguments or a
configuration file. All specified arguments will override the configuration file values
You can display this message at any moment using python main.py -h.
- Bing desktop searches with current User-Agents
- Mobile Read to Earn
- Complete the daily set automatically
- Complete punch cards automatically
- Complete the others promotions automatically
- Claim bonus points automatically
- Headless Mode
- Multi-Account Management
- Session storing
- 2FA Support
- Notifications via Apprise - no longer limited to Telegram or Discord
- Proxy Support (3.0) - they need to be high quality proxies
- Logs to CSV file for point tracking
Note
Mobile searches are not automated because they do not yield points through browser automation. The mobile channel remains available for Read to Earn tasks.