[!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.
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-Script
Or, download the latest release ZIP and extract it.
env.example to .env and add your account credentials:ACCOUNT_1_EMAIL=email@example.com
ACCOUNT_1_PASSWORD=your_password
[!NOTE] Add one
ACCOUNT_N_*block per account, numbered from 1 with no gaps — the script stops at the first missingACCOUNT_N_EMAIL. Optional per-account fields cover recovery email, locale (ACCOUNT_N_GEO_LOCALEdefaults toauto, the locale of your Microsoft profile), language, proxy, and fingerprint persistence — seeenv.examplefor all of them.[!TIP] For 2FA accounts, set
ACCOUNT_N_TOTP_SECRETand 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.
config.example.json to config.json (in the project root) and customize your preferences.config.json is automatically created on first run and saved locally to ./config/. You can optionally manually create a config.json (e.g., if you need to specify regex values) using the provided config.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
compose.yamlenv.example to .env and add your account credentials:ACCOUNT_1_EMAIL=email@example.com
ACCOUNT_1_PASSWORD=your_password
compose.yaml to adjust scheduling, timezone, and config options.[!NOTE] A valid
config.jsonis auto-generated on first run using default values, and saved locally to./config/. Optionally, useCONFIG_*variables in theenvironment:section of thecompose.yamlto 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.jsonand restart — a fresh one will be generated from the latest example, with yourcompose.yamloverrides re-applied.
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 incompose.yamlfor 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 inconfig.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) |
$ claude mcp add Microsoft-Rewards-Script \
-- python -m otcore.mcp_server <graph>