Config Explorer
Every open-wa config option in three forms: wa.config.json, CLI flags, and WA_ environment variables.
Config Explorer
open-wa has one configuration schema, and every option can be set three ways:
- in a config file (
wa.config.json/wa.config.mjs), by its key - as a CLI flag (
--kebab-case) - as an environment variable (
WA_UPPER_SNAKE)
Use the explorer below to search every option, filter by group, and switch between the three forms. The table and the copy-paste snippet update to match the format you pick. Options are grouped by area (browser, session, server, logging, and so on) — the groups are inferred from the config schema itself, so they always match the source.
Session & Authentication (8)
ephemeralbooleandefault: falseWhen true, prevents auto-derivation of userDataDir from sessionId. The browser launches with an ephemeral temp profile that is discarded on exit. Useful for testing without leaving _IGNORE_ directories behind.
licenseKeystring | object | functionoptionalLicense key for unknown number messaging.
linkCodestringoptionalLink code for new login method.
sessionDataobject | stringoptionalDeprecated compatibility input for JSON or base64 session restore. This MD-obsolete flow remains only for legacy migration. Prefer userDataDir for persistent auth state.
sessionDataPathstringdefault: ""Deprecated legacy path for .data.json session restore files. This only exists for MD-obsolete JSON session compatibility. Prefer userDataDir.
sessionIdstringdefault: "session"Name of the session. Must be unique.
skipSessionSavebooleandefault: falseDeprecated legacy flag for .data.json session persistence. This only affects the MD-obsolete JSON restore path. Prefer userDataDir-managed persistence.
userDataDirstringoptionalBrowser profile directory used for persistent session storage.
Browser Configuration (22)
allowDangerousBrowserArgsbooleanoptionalAllow known-dangerous chromium args (--single-process, --no-zygote) that are normally stripped. Unsupported: these cause detached-frame crash loops on modern Chrome.
browserRevisionstringoptionalSpecific browser revision to download and use.
browserWSEndpointstringoptionalConnect to existing chrome window (Experimental).
bypassCSPbooleandefault: falseDisable cors (bypass pagesetbypasscspenabled).
chromiumArgsstring[]optionalCustom chrome/chromium argument strings. Note: --single-process and --no-zygote are stripped by default because they crash WhatsApp Web with "Navigating frame was detached" on modern Chrome; set allowDangerousBrowserArgs to force them.
corsFixbooleandefault: falseBypass web security to fix CORS issues.
executablePathstringoptionalPath to chrome instance.
headlessbooleandefault: trueRun browser in headless mode.
lightpandaobjectoptionalLightpanda local mode configuration.
lightpanda.disableTelemetrybooleandefault: falseDisable Lightpanda telemetry for deterministic startup.
lightpanda.executablePathstringoptionalOverride path to Lightpanda binary.
lightpanda.hoststringdefault: "127.0.0.1"Lightpanda bind address.
lightpanda.portStartnumberdefault: 9000First Lightpanda port to try.
lightpanda.startupTimeoutMsnumberdefault: 30000How long to wait for Lightpanda readiness.
proxyServerCredentialsobjectoptionalProxy server credentials.
raspibooleandefault: falseEnable Raspberry Pi OS support.
resizablebooleandefault: trueSync viewport size with window size.
useChromebooleandefault: falseAutomatically detect chrome instance.
useLightpandabooleandefault: falseEnable Lightpanda local browser mode.
useNativeProxybooleandefault: falseUse native proxy system.
useStealthbooleandefault: falseEnable/disable puppeteer stealth plugin.
viewportobjectoptionalQR Code Configuration (7)
ezqrbooleandefault: trueEnable easy QR code endpoint.
qrFormat"png" | "jpeg" | "webm"default: "png"QR code output format.
qrLogSkipbooleandefault: falseSkip logging QR Code to console.
qrMaxnumberoptionalAutomatically kill the process after a set amount of qr codes.
qrPopUpOnlybooleanoptionalDowngraded legacy QR convenience flag. v5 may still expose QR PNG output, but popup and local QR parity is not a guaranteed runtime contract.
qrQualitynumberdefault: 1QR code output quality (0.1 - 1.0).
qrTimeoutnumberdefault: 60Wait time for QR scan before killing process. 0 to wait forever.
Authentication & Timeouts (4)
authTimeoutnumberdefault: 60Wait time for session authentication.
callTimeoutnumberdefault: 0Wait time for client method resolution.
oorTimeoutnumberdefault: 60Phone out of reach check timeout.
waitForRipeSessionTimeoutnumberdefault: 5Wait time for session to load fully. 0 to wait forever.
Popup & UI (1)
popupboolean | numberdefault: falseDowngraded legacy compatibility option. Opens a local browser window for status or manual inspection, but v5 does not guarantee legacy popup QR parity.
Logging & Debugging (9)
devtoolsboolean | objectoptionalEnable remote devtools.
disableSpinsbooleandefault: falseDisable spins in logs (for docker).
logConsolebooleandefault: falseLog console messages from browser.
logConsoleErrorsbooleandefault: falseLog error messages from browser.
logDebugInfoAsObjectbooleandefault: falseLog debug info as object instead of console.table.
logFilebooleandefault: falseCreate log file for all actions.
loggingobject[]optionalWinston logging transport configurations.
logInternalEventsbooleanoptionalLog all internal wa web events.
logLevelstringoptionalLogging level (VERBOSE, INFO, ERROR, SILENT).
Process Behavior (5)
killClientOnLogoutbooleandefault: falseKill client when logout detected.
killProcessOnBanbooleandefault: trueKill process when temporary ban detected.
killProcessOnBrowserClosebooleandefault: falseKill process when browser closes.
killProcessOnTimeoutbooleandefault: falseKill process on auth/qr timeout.
restartOnCrashanyoptionalFunction to call upon restart if page crashes.
Safety & Error Handling (4)
onError"AS_STRING" | "RETURN_FALSE" | "THROW" | "LOG_AND_FALSE" | "LOG_AND_STRING" | "RETURN_ERROR" | "NOTHING"default: "NOTHING"Error handling strategy.
safeModebooleandefault: falseCheck if page is valid before each command.
throwErrorOnTosBlockbooleanoptionalThrow error if session blocked or unable to get QR.
throwOnExpiredSessionDatabooleandefault: falseReturn false if session data expired.
Features & Behavior (22)
aggressiveGarbageCollectionbooleanoptionalRun gc() before every command sent to the browser.
autoRefreshbooleandefault: trueAutomatically refresh QR codes (Deprecated).
blockAssetsbooleandefault: falseBlock all assets from loading.
blockCrashLogsbooleandefault: trueBlock network calls to crash log servers.
cachedPatchbooleandefault: falseSave local copy of patches.json.
cacheEnabledbooleandefault: falseEnable/disable cache.
customUserAgentstringoptionalCustom user agent.
deleteSessionDataOnLogoutbooleandefault: falseDelete session data file on logout.
ensureHeadfulIntegritybooleanoptionalMakes sure the headless session is usable even on first login.
eventModebooleandefault: trueAutomatically register SimpleListener events.
ghPatchbooleandefault: falseUse default cached raw github link for patches.
hostNotificationLang"pt-br" | "en-gb" | "de-de" | "id-id" | "it-it" | "nl-nl" | "es"optionalLanguage of host notification.
idCorrectionbooleandefault: falseAttempt to correct invalid chatIds.
ignoreNukebooleanoptionalDon't implicitly determine if the host logged out.
inDockerbooleandefault: falseTry to infer config from environment variables.
keepUpdatedbooleandefault: falseAlways start with latest version (Alpha).
legacybooleandefault: falseRoll back on late beta features.
qrRefreshSnumberoptionalQR refresh interval (Deprecated).
screenshotOnInitializationBrowserErrorbooleandefault: falseScreenshot on unexpected initialization error.
skipBrokenMethodsCheckbooleandefault: falseBypass health check before startup.
skipUpdateCheckbooleandefault: falseBypass latest version check.
waitForRipeSessionbooleandefault: trueWait for a valid headful session.
Stickers & Messaging (3)
autoEmojistring | falsedefault: ":"Automatic emoji detection character.
linkParserstringdefault: "https://link.openwa.cloud/api"URL of serverless meta grabber.
stickerServerEndpointstring | booleandefault: "https://sticker-api.openwa.dev"Sticker server endpoint.
Preprocessors & Cloud Upload (4)
cloudUploadOptionsobjectoptionalOptions for cloud upload preprocessor.
messagePreprocessoranyoptionalMessage preprocessor options.
pQueueDefaultanyoptionalDefault pqueue options.
preprocFilterstringoptionalFilter for message preprocessor.
Session Limits (3)
discordstringoptionalYour Discord ID to get onto the sticker leaderboard.
maxChatsnumberoptionalMaximum amount of chats to be present in a session.
maxMessagesnumberoptionalMaximum amount of messages to be present in a session.
Multi-device (2)
multiDevicebooleandefault: trueEnable multi-device support (Beta).
sessionDataBucketAuthstringoptionalBase64 encoded S3 Bucket & Authentication object.
v5 Specific Features (6)
apiLifecycle"immediate" | "post-connection" | "hybrid"default: "hybrid"When to start the API: immediate, after connection, or hybrid (QR only first).
dashboardbooleandefault: trueLaunch the session management dashboard. Disable with --no-dashboard.
dashboardPortnumberdefault: 3000Port for the dashboard sidecar. Defaults to 3000.
integrationsobjectoptionalIntegration configurations (chatwoot, webhook, n8n, etc.). Changes require restart.
proxyHoststringoptionalHost of the Cloudflare session proxy worker, e.g. wss://proxy.account.workers.dev
proxyTokenstringoptionalToken used to authenticate this session with the Cloudflare proxy upstream.
Server Configuration (5)
apiKeystringoptionalAPI key for authentication (minimum 8 characters).
corsstring | string[]default: "*"CORS allowed origins.
hoststringdefault: "localhost"Host address to bind.
portnumberdefault: 8080Port for the API server.
webhookstringoptionalWebhook URL for events.
ElasticSearch Monitoring (10)
elasticBufferSizenumberdefault: 50ElasticSearch buffer size.
elasticIndexPrefixstringdefault: "open-wa-"ElasticSearch index prefix.
elasticPasswordstringoptionalElasticSearch password.
elasticPipelinestringoptionalElasticSearch ingest pipeline.
elasticUrlstringoptionalElasticSearch URL.
elasticUsernamestringoptionalElasticSearch username.
mcpobjectoptionalEasy API MCP configuration. Hosted MCP requires apiKey.
pluginConfigobjectdefault: {}Plugin configuration keyed by plugin name.
pluginsstring[]default: []Plugin references to load (npm packages or file paths).
s3SyncobjectoptionalS3 Session Synchronization configuration
Show the 115 shown options as wa.config.json
{
"aggressiveGarbageCollection": true,
"allowDangerousBrowserArgs": true,
"apiKey": "<apiKey>",
"apiLifecycle": "hybrid",
"authTimeout": 60,
"autoEmoji": ":",
"autoRefresh": true,
"blockAssets": false,
"blockCrashLogs": true,
"browserRevision": "<browserRevision>",
"browserWSEndpoint": "<browserWSEndpoint>",
"bypassCSP": false,
"cachedPatch": false,
"cacheEnabled": false,
"callTimeout": 0,
"chromiumArgs": "",
"cloudUploadOptions": "<cloudUploadOptions>",
"cors": "*",
"corsFix": false,
"customUserAgent": "<customUserAgent>",
"dashboard": true,
"dashboardPort": 3000,
"deleteSessionDataOnLogout": false,
"devtools": "<devtools>",
"disableSpins": false,
"discord": "<discord>",
"elasticBufferSize": 50,
"elasticIndexPrefix": "open-wa-",
"elasticPassword": "<elasticPassword>",
"elasticPipeline": "<elasticPipeline>",
"elasticUrl": "<elasticUrl>",
"elasticUsername": "<elasticUsername>",
"ensureHeadfulIntegrity": true,
"ephemeral": false,
"eventMode": true,
"executablePath": "<executablePath>",
"ezqr": true,
"ghPatch": false,
"headless": true,
"host": "localhost",
"hostNotificationLang": "<hostNotificationLang>",
"idCorrection": false,
"ignoreNuke": true,
"inDocker": false,
"integrations": "<integrations>",
"keepUpdated": false,
"killClientOnLogout": false,
"killProcessOnBan": true,
"killProcessOnBrowserClose": false,
"killProcessOnTimeout": false,
"legacy": false,
"licenseKey": "<licenseKey>",
"lightpanda": "<lightpanda>",
"linkCode": "<linkCode>",
"linkParser": "https://link.openwa.cloud/api",
"logConsole": false,
"logConsoleErrors": false,
"logDebugInfoAsObject": false,
"logFile": false,
"logging": "",
"logInternalEvents": true,
"logLevel": "<logLevel>",
"maxChats": 0,
"maxMessages": 0,
"mcp": "<mcp>",
"messagePreprocessor": "<messagePreprocessor>",
"multiDevice": true,
"onError": "NOTHING",
"oorTimeout": 60,
"pluginConfig": "{}",
"plugins": "[]",
"popup": "false",
"port": 8080,
"pQueueDefault": "<pQueueDefault>",
"preprocFilter": "<preprocFilter>",
"proxyHost": "<proxyHost>",
"proxyServerCredentials": "<proxyServerCredentials>",
"proxyToken": "<proxyToken>",
"qrFormat": "png",
"qrLogSkip": false,
"qrMax": 0,
"qrPopUpOnly": true,
"qrQuality": 1,
"qrRefreshS": 0,
"qrTimeout": 60,
"raspi": false,
"resizable": true,
"restartOnCrash": "<restartOnCrash>",
"s3Sync": "<s3Sync>",
"safeMode": false,
"screenshotOnInitializationBrowserError": false,
"sessionData": "<sessionData>",
"sessionDataBucketAuth": "<sessionDataBucketAuth>",
"sessionDataPath": "",
"sessionId": "session",
"skipBrokenMethodsCheck": false,
"skipSessionSave": false,
"skipUpdateCheck": false,
"stickerServerEndpoint": "https://sticker-api.openwa.dev",
"throwErrorOnTosBlock": true,
"throwOnExpiredSessionData": false,
"useChrome": false,
"useLightpanda": false,
"useNativeProxy": false,
"userDataDir": "<userDataDir>",
"useStealth": false,
"viewport": "<viewport>",
"waitForRipeSession": true,
"waitForRipeSessionTimeout": 5,
"webhook": "<webhook>"
}This page is generated from @open-wa/config's schema, so it always matches the
options the runtime actually accepts.

Was this helpful?
Wally and his cute companion coffee mug are coding day and night to keep this up-to-date!
