Tip
This version supports the new, modern Bing Rewards dashboard only - it does not support the legacy dashboard. If your account still uses the old dashboard, use the v3 branch and v3.x releases instead!
Use at your own risk - some features may not work as expected.
- Table of Contents
- Quick Setup
- Account Setup
- Config Setup
- Docker
- Nix Setup
- Configuration Options
- Troubleshooting
- Disclaimer
Requirements: Node.js >= 24 and Git
Works on Windows, Linux, macOS, and WSL.
git clone https://github.com/TheNetsky/Microsoft-Rewards-Script.git
cd Microsoft-Rewards-ScriptOr, download the latest release ZIP and extract it.
- Copy and rename
env.exampleto.envand add your account credentials:
ACCOUNT_1_EMAIL=email@example.com
ACCOUNT_1_PASSWORD=your_passwordNote
Add one ACCOUNT_N_* block per account, numbered from 1 with no gaps — the script stops at the first missing ACCOUNT_N_EMAIL. Optional per-account fields cover recovery email, locale (ACCOUNT_N_GEO_LOCALE defaults to auto, the locale of your Microsoft profile), language, proxy, and fingerprint persistence — see env.example for all of them.
Tip
For 2FA accounts, set ACCOUNT_N_TOTP_SECRET and the script will generate and enter the 6-digit code automatically. To get the secret: in your Microsoft Security settings open 'Manage how you sign in', add an Authenticator app, and when the QR code appears choose 'enter code manually' — use that code as the value in your .env.
Warning
You must rebuild your script after making any changes to the .env.
Warning
Do not skip this step if you are running the script bare metal.
- Bare metal: Copy or rename
config.example.jsontoconfig.json(in the project root) and customize your preferences. - Docker: A valid
config.jsonis automatically created on first run and saved locally to./config/. You can optionally manually create aconfig.json(e.g., if you need to specify regex values) using the providedconfig.example.json
Caution
Prior versions of accounts.json and config.json are not compatible with current release.
npm run pre-build
npm run build
npm run start- Copy the sample
compose.yaml - Copy and rename
env.exampleto.envand add your account credentials:
ACCOUNT_1_EMAIL=email@example.com
ACCOUNT_1_PASSWORD=your_password- Review
compose.yamlto adjust scheduling, timezone, and config options.
Note
A valid config.json is auto-generated on first run using default values, and saved locally to ./config/.
Optionally, use CONFIG_* variables in the environment: section of the compose.yaml to customise your options (e.g., clusters, webhook, etc.).
A full list of available options are in the table below.
CONFIG_* variables are applied on every startup and always take precedence over ./config/config.json.
Tip
If a new image adds config options you're missing, a warning will appear in the container logs.
To update, delete ./config/config.json and restart — a fresh one will be generated from the latest example, with your compose.yaml overrides re-applied.
- Start the container:
docker compose up -d
Tip
Monitor logs with docker logs microsoft-rewards-script, useful for viewing passwordless login codes or diagnosing issues.
You can also enable a webhook in compose.yaml for notifications.
If using Nix: bash scripts/nix/run.sh
Edit config.json to customize behavior, or set CONFIG_* environment variables in compose.yaml (Docker). Below are all currently available options.
Warning
Rebuild the script (bare metal), or recreate the container (Docker) after all config changes.
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
sessionPath |
string | "sessions" |
Directory to store browser sessions | |
headless |
boolean | false |
Run browser invisibly | Always true in Docker |
clusters |
number | 1 |
Number of concurrent account clusters | CONFIG_CLUSTERS |
errorDiagnostics |
boolean | false |
Enable error diagnostics | CONFIG_ERROR_DIAGNOSTICS |
ensureStreakProtection |
boolean | true |
Ensure streak protection is enabled | CONFIG_ENSURE_STREAK_PROTECTION |
autoClaimPunchcardRewards |
boolean | false |
Auto-claim completed punchcard rewards | CONFIG_AUTO_CLAIM_PUNCHCARD_REWARDS |
skipNonPointTasks |
boolean | true |
Skip tasks that award no points | CONFIG_SKIP_NON_POINT_TASKS |
searchOnBingLocalQueries |
boolean | false |
Use the local query list for ExploreOnBing | CONFIG_SEARCH_ON_BING_LOCAL |
globalTimeout |
string | "30sec" |
Timeout for all actions | CONFIG_GLOBAL_TIMEOUT |
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
workers.doDailySet |
boolean | true |
Complete daily set | CONFIG_WORKER_DAILY_SET |
workers.doClaimBonusPoints |
boolean | true |
Claim bonus points | CONFIG_WORKER_CLAIM_BONUS_POINTS |
workers.doMorePromotions |
boolean | true |
Complete "more activities" | CONFIG_WORKER_MORE_PROMOTIONS |
workers.doPunchCards |
boolean | true |
Complete punchcards | CONFIG_WORKER_PUNCH_CARDS |
workers.doAppPromotions |
boolean | true |
Complete app promotions | CONFIG_WORKER_APP_PROMOTIONS |
workers.doDesktopSearch |
boolean | true |
Perform desktop searches | CONFIG_WORKER_DESKTOP_SEARCH |
workers.doMobileSearch |
boolean | true |
Perform mobile searches | CONFIG_WORKER_MOBILE_SEARCH |
workers.doBonusSearches |
boolean | false |
Farm bonus searches beyond the cap | CONFIG_WORKER_BONUS_SEARCHES |
workers.doDailyCheckIn |
boolean | true |
Complete daily check-in | CONFIG_WORKER_DAILY_CHECKIN |
workers.doReadToEarn |
boolean | true |
Complete Read-to-Earn | CONFIG_WORKER_READ_TO_EARN |
workers.doActivateSearchPerk |
boolean | true |
Activate the "search Nx more" perk when present (runs after the daily set) | CONFIG_WORKER_ACTIVATE_SEARCH_PERK |
workers.doVisualSearch |
boolean | false |
Activate the visual-search streak and perform visual searches | CONFIG_WORKER_VISUAL_SEARCH |
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
activities.urlReward |
boolean | true |
Complete URL reward activities | CONFIG_ACTIVITY_URL_REWARD |
activities.searchOnBing |
boolean | true |
Complete ExploreOnBing offers | CONFIG_ACTIVITY_SEARCH_ON_BING |
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
searchSettings.scrollRandomResults |
boolean | false |
Scroll randomly on results | CONFIG_SEARCH_SCROLL_RANDOM |
searchSettings.clickRandomResults |
boolean | false |
Click random links | CONFIG_SEARCH_CLICK_RANDOM |
searchSettings.runOnZeroPoints |
boolean | false |
Run searches even when no search points remain | CONFIG_SEARCH_RUN_ON_ZERO_POINTS |
searchSettings.maxBonusSearches |
number | 110 |
Max bonus searches per run (when doBonusSearches is on) |
CONFIG_SEARCH_MAX_BONUS_SEARCHES |
searchSettings.parallelSearching |
boolean | true |
Run searches in parallel | CONFIG_SEARCH_PARALLEL |
searchSettings.queryEngines |
string[] | see Query sources | Sources used to build the search query pool | CONFIG_SEARCH_QUERY_ENGINES * |
searchSettings.searchResultVisitTime |
string | "10sec" |
Time to spend on each search result | CONFIG_SEARCH_VISIT_TIME |
searchSettings.searchDelay.min |
string | "30sec" |
Minimum delay between searches | CONFIG_SEARCH_DELAY_MIN |
searchSettings.searchDelay.max |
string | "1min" |
Maximum delay between searches | CONFIG_SEARCH_DELAY_MAX |
searchSettings.readDelay.min |
string | "30sec" |
Minimum delay for reading | CONFIG_SEARCH_READ_DELAY_MIN |
searchSettings.readDelay.max |
string | "1min" |
Maximum delay for reading | CONFIG_SEARCH_READ_DELAY_MAX |
Note
* Docker CONFIG_* array values are comma-separated strings e.g. "error,warn". Regex patterns must be set directly in config.json.
searchSettings.queryEngines controls where search queries come from. Pick any combination; topics from all selected sources are pooled, de-duplicated, and expanded with Bing autosuggest/related terms.
Core sources:
| Selector | Source |
|---|---|
google |
Google Trends (trending searches) |
wikipedia |
Wikipedia most-read articles (previous day) |
wikirandom |
Random Wikipedia articles |
hackernews |
Hacker News front-page stories |
reddit |
Reddit r/popular post titles |
local |
Bundled src/functions/search-queries.json list |
RSS feeds use a dotted path - rss for every feed, rss.<site> for a whole site, or rss.<site>.<endpoint> for a single feed:
| Selector | Feeds |
|---|---|
rss.googleTrends |
Google Trends RSS (gb, us) |
rss.googleNews |
Google News (gb, us, world, technology, business) |
rss.bbc |
BBC News (top, world, technology, business, science) |
rss.guardian |
The Guardian (international, world, technology) |
rss.theVerge |
The Verge (all) |
rss.arsTechnica |
Ars Technica (all) |
rss.reddit |
Reddit listing feeds (popular, worldnews, technology) |
Add your own feeds in src/constants/rssFeeds.ts.
Default:
[
"google",
"wikipedia",
"wikirandom",
"hackernews",
"reddit",
"local",
"rss.googleTrends",
"rss.googleNews",
"rss.bbc",
"rss.guardian.world",
"rss.theVerge.all"
]Opt-in features that may change. Disabled by default.
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
experimental.apiSearch |
boolean | false |
Perform Bing searches over HTTP instead of driving a browser page | CONFIG_EXPERIMENTAL_API_SEARCH |
experimental.apiSearchOnBing |
boolean | false |
Complete ExploreOnBing offers over HTTP instead of the browser | CONFIG_EXPERIMENTAL_API_SEARCH_ON_BING |
Note
The API paths are faster but depend on the modern dashboard's endpoints. If an ExploreOnBing offer ever fails to be credited, turn apiSearchOnBing off to fall back to the browser path.
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
debugLogs |
boolean | false |
Enable debug logging | CONFIG_DEBUG_LOGS |
consoleLogFilter.enabled |
boolean | false |
Enable console log filtering | CONFIG_LOG_FILTER_ENABLED |
consoleLogFilter.mode |
string | "whitelist" |
Filter mode (whitelist/blacklist) | CONFIG_LOG_FILTER_MODE |
consoleLogFilter.levels |
string[] | ["error", "warn"] |
Log levels to filter | CONFIG_LOG_FILTER_LEVELS * |
consoleLogFilter.keywords |
string[] | ["starting account"] |
Keywords to filter | CONFIG_LOG_FILTER_KEYWORDS * |
consoleLogFilter.regexPatterns |
string[] | [] |
Regex patterns for filtering |
Note
* Docker CONFIG_* array values are comma-separated strings e.g. "error,warn". Regex patterns must be set directly in config.json.
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
proxy.queryEngine |
boolean | true |
Proxy query engine requests | CONFIG_PROXY_QUERY_ENGINE |
| Setting | Type | Default | Description | Docker environment variable |
|---|---|---|---|---|
webhook.discord.enabled |
boolean | false |
Enable Discord webhook | CONFIG_DISCORD_ENABLED |
webhook.discord.url |
string | "" |
Discord webhook URL | CONFIG_DISCORD_URL |
webhook.telegram.enabled |
string | "" |
Enable Telegram webhook | CONFIG_TELEGRAM_ENABLED |
webhook.telegram.botToken |
string | "" |
Telegram bot token | CONFIG_TELEGRAM_BOTTOKEN |
webhook.telegram.chatId |
string | "" |
Telegram chat id | CONFIG_TELEGRAM_CHATID |
webhook.ntfy.enabled |
boolean | false |
Enable ntfy notifications | CONFIG_NTFY_ENABLED |
webhook.ntfy.url |
string | "" |
ntfy server URL | CONFIG_NTFY_URL |
webhook.ntfy.topic |
string | "" |
ntfy topic | CONFIG_NTFY_TOPIC |
webhook.ntfy.token |
string | "" |
ntfy authentication token | CONFIG_NTFY_TOKEN |
webhook.ntfy.title |
string | "Microsoft-Rewards-Script" |
Notification title | CONFIG_NTFY_TITLE |
webhook.ntfy.tags |
string[] | ["bot", "notify"] |
Notification tags | CONFIG_NTFY_TAGS * |
webhook.ntfy.priority |
number | 3 |
Notification priority (1-5) | CONFIG_NTFY_PRIORITY |
webhook.webhookLogFilter.enabled |
boolean | false |
Enable webhook log filtering | CONFIG_WEBHOOK_LOG_FILTER_ENABLED |
webhook.webhookLogFilter.mode |
string | "whitelist" |
Filter mode (whitelist/blacklist) | CONFIG_WEBHOOK_LOG_FILTER_MODE |
webhook.webhookLogFilter.levels |
string[] | ["error"] |
Log levels to send | CONFIG_WEBHOOK_LOG_FILTER_LEVELS * |
webhook.webhookLogFilter.keywords |
string[] | ["starting account", "select number", "collected"] |
Keywords to filter | CONFIG_WEBHOOK_LOG_FILTER_KEYWORDS * |
webhook.webhookLogFilter.regexPatterns |
string[] | [] |
Regex patterns for filtering |
Note
* Docker CONFIG_* array values are comma-separated strings e.g. "error,warn". Regex patterns must be set directly in config.json.
Warning
NTFY users set the webhookLogFilter to enabled, or you will receive push notifications for all logs.
When enabled, only account start, 2FA codes, and account completion summaries are delivered as push notifications.
Customize which notifications you receive with the keywords options.
Tip
Most login issues can be fixed by deleting your /sessions folder, and redeploying the script
Use at your own risk.
Automation of Microsoft Rewards may lead to account suspension or bans.
This software is provided for educational purposes only.
The authors are not responsible for any actions taken by Microsoft.