Synadia Insights

Configuration

Insights uses a layered configuration system. Every setting can be specified through CLI flags, environment variables, or a YAML config file.

Priority Order

When the same setting is defined in multiple places, the highest-priority source wins:

  1. CLI flags (e.g., --server nats://host:4222)
  2. Environment variables (e.g., INSIGHTS_NATS_SERVER=nats://host:4222)
  3. YAML config file (loaded via --config config.yaml)
  4. Built-in defaults

Config File

Load a YAML config file with the --config (or -c) flag:

./insights --config /etc/insights/config.yaml

An annotated example of the common options with their defaults:

# Insights Configuration Example
#
# Annotated example of the common configuration options with their defaults.
# Load this config with: insights --config config.yaml
#
# Configuration priority (highest wins):
#   1. CLI flags (e.g., --server)
#   2. Environment variables (e.g., INSIGHTS_NATS_SERVER)
#   3. Config file (this file)
#   4. Defaults

# Log level: debug, info, warn, error
log-level: 'info'

# License configuration.
# Provide either a raw JWT string or a path to a file containing the JWT.
# If both are set, the file takes precedence.
# Required in production builds. Not required when simulator is enabled or in dev builds (--tags insights_nolicense).
license:
  # Raw license JWT token string.
  # Env: INSIGHTS_LICENSE_TOKEN
  token: ''

  # Path to a file containing the license JWT.
  # Env: INSIGHTS_LICENSE_FILE
  file: ''

# Base directory for persistent storage (DuckDB database + JetStream data).
# If empty, a temporary directory is created and data is lost on restart.
# Set this for persistent deployments.
data-dir: ''

# Top-level NATS connection for serving the API.
# These credentials are used by the API server and as defaults
# for indexer and scraper if not explicitly configured.
nats:
  # NATS server URL
  server: ''

  # Path to credentials file (.creds)
  creds: ''

  # NATS context name (from nats context)
  context: ''

  # Username for basic auth
  user: ''

  # Password for basic auth
  password: ''

  # NKey seed for NKey+JWT auth (requires jwt to also be set)
  nkey: ''

  # User JWT for authentication.
  # If nkey is also set, used as NKey-signed JWT auth.
  # If standalone, used as a bearer token (server must have bearer_token enabled).
  jwt: ''

  # TLS certificate path
  tls-cert: ''

  # TLS key path
  tls-key: ''

  # TLS CA certificate path
  tls-ca-cert: ''

  # Perform TLS handshake first (before NATS protocol)
  tls-first: false

  # SOCKS proxy URL for connections
  socks-proxy: ''

# NATS system account credentials for the target system being scraped.
# This connection is used to issue $SYS requests to collect metrics.
# This is required if the simulator is disabled.
sys: {}

# Database configuration for DuckDB.
db:
  # DuckDB memory limit. Caps the buffer pool to prevent swapping on large databases.
  # Examples: "4GB", "8GB", "16GB". Default: "4GB".
  # Env: INSIGHTS_DB_MEMORY_LIMIT
  memory-limit: '4GB'

  # DuckDB worker threads. 0 uses DuckDB's default (all cores).
  # Reduce to leave cores for the indexer and web server.
  # Env: INSIGHTS_DB_THREADS
  threads: 0

  # Max wall-clock time a single $INS.db.query statement may run before it is interrupted.
  # Guards against a pathological query (e.g. a count over a cartesian relation, which is pure
  # CPU and never trips the memory limit) pegging the server. 0 disables the cap.
  # Env: INSIGHTS_DB_QUERY_TIMEOUT
  query-timeout: 2m

  # Max rows the non-streaming $INS.db.query endpoint may return. That endpoint buffers the
  # whole result before responding, so an unbounded SELECT * could return enough rows to run
  # the server out of memory (the DuckDB memory_limit does not bound this buffered reply).
  # Oversized results are rejected with a 413 pointing at the streaming endpoint
  # $INS.db.query.stream. 0 disables the cap.
  # Env: INSIGHTS_DB_QUERY_MAX_ROWS
  query-max-rows: 100000

  # Streaming query endpoint ($INS.db.query.stream). Pushes results as windowed Arrow IPC
  # chunks (rendered to CSV/JSON client-side) so arbitrarily large results never accumulate
  # in memory on either side, so it is not subject to the query-max-rows cap (it carries only
  # the large query-stream.max-rows safety limit below).
  query-stream:
    # Max chunks kept in flight unacknowledged before the server pauses producing. Bounds
    # client-side buffering to roughly window × chunk-size.
    # Env: INSIGHTS_DB_QUERY_STREAM_WINDOW
    window: 16

    # Target size of each chunk message (IEC units). Clamped below the connection max_payload.
    # Env: INSIGHTS_DB_QUERY_STREAM_CHUNK_SIZE
    chunk-size: 512KiB

    # Max time to produce each Arrow batch (incl. the first), bounding a stalled or slow-to-
    # first-row query. 0 disables.
    # Env: INSIGHTS_DB_QUERY_STREAM_BATCH_TIMEOUT
    batch-timeout: 30s

    # Abort the scan if the client sends no acknowledgement within this window (dead/Ctrl-C'd
    # consumer). 0 disables.
    # Env: INSIGHTS_DB_QUERY_STREAM_ACK_IDLE_TIMEOUT
    ack-idle-timeout: 30s

    # Per-buffer Arrow IPC compression for streamed chunks: none, lz4, or zstd. Clients
    # decompress transparently. Compression uses additional CPU; leave none unless bandwidth
    # is the bottleneck.
    # Env: INSIGHTS_DB_QUERY_STREAM_COMPRESSION
    compression: none

    # Abort a streamed query after this many rows, failing fast with guidance to scope it.
    # Streaming stays memory-bounded, so this is not a memory guard — it is a safety limit
    # against an unscoped SELECT * over a per-epoch table/view tying up the endpoint. Bounded
    # queries (epoch-scoped, entity-scoped, or LIMITed) never reach it. 0 disables the cap.
    # Env: INSIGHTS_DB_QUERY_STREAM_MAX_ROWS
    max-rows: 1000000

  # Retention policy for automatic epoch cleanup from DuckDB.
  retention:
    # How long to keep data. 0 disables retention.
    # Env: INSIGHTS_DB_RETENTION_DURATION
    duration: 768h

    # How often the retention sweep runs.
    # Env: INSIGHTS_DB_RETENTION_INTERVAL
    interval: 10m

  # Live memory profiler: samples duckdb_memory() so `ops sizing` and
  # `ops memory` can use measured peaks instead of estimates.
  memory-profile:
    # Enable the background memory profiler.
    # Env: INSIGHTS_DB_MEMORY_PROFILE_ENABLED
    enabled: true

    # How often to sample duckdb_memory() (metadata-cheap).
    # Env: INSIGHTS_DB_MEMORY_PROFILE_INTERVAL
    interval: 2s

    # Rolling window retained in memory for the peak and the Realtime chart.
    # Env: INSIGHTS_DB_MEMORY_PROFILE_WINDOW
    window: 15m

# Scraper configuration for collecting metrics from NATS servers.
scraper:
  # Enable or disable the scraper
  enabled: true

  # Timeout for scrape requests
  timeout: 30s

  # Interval between scrapes
  interval: 1m

  # Optional NATS connection for publishing scraped data.
  # If not specified, uses the indexer NATS config (or top-level NATS).
  nats: {}

# Indexer configuration for processing and storing scraped data.
indexer:
  # Enable or disable the indexer
  enabled: true

  # Start consuming from the latest message in the stream
  stream-latest: false

  # Start consuming from a specific epoch number
  stream-epoch: 0

  # Filter specific Z endpoints to process (comma-separated: varz,jsz,connz)
  stream-filters: ''

  # Downsample interval for consuming epochs
  stream-interval: 0s

  # Optional NATS connection for consuming scraped data.
  # If not specified, uses the top-level NATS config.
  nats: {}

# Sink configuration for the embedded NATS server.
sink:
  # Use an embedded NATS server for storing scraped data.
  embed: true

  # Optional NATS server config file for the embedded server.
  # The file is parsed first, then Insights-specific settings are applied on top.
  # config-file: /path/to/nats-server.conf

  # Host to bind the embedded NATS server to
  host: '127.0.0.1'

  # Port to bind the embedded NATS server to (0 = random)
  port: 0

  # JetStream stream name for storing scraped data
  stream: 'scrape'

  # Batch size for sink operations
  batch-size: 500

  # How long to keep scraped data in the sink stream. 0 disables retention.
  # Env: INSIGHTS_SINK_RETENTION
  retention: 24h

# Embedded NATS simulator configuration.
# When enabled, starts real in-process NATS clusters with traffic workloads
# so you can try insights with zero configuration.
simulator:
  # Enable the embedded simulator
  enabled: false

  # Profiles: core-{small,medium,large}, js-{small,medium,large},
  #   super-{small,medium,large}, leaf-{small,medium,large},
  #   super-leaf-{small,medium,large}
  profile: 'js-small'

# Web server configuration for the Exo-based UI.
web:
  # Enable or disable the web server
  enabled: true

  # Hostname to bind the web server to
  hostname: '127.0.0.1'

  # Port to bind the web server to
  port: 8080

  # Session seed for secure cookies.
  # The default "insights" preserves sessions across restarts but should be
  # changed to a unique value for production deployments.
  session-seed: 'insights'

  # Enable TLS (HTTPS). When enabled, HTTP/2 is automatically available via ALPN.
  # You must provide tls-cert and tls-key below; enabling TLS without them fails at
  # startup (no self-signed certificate is generated).
  tls: false

  # Path to TLS certificate file.
  tls-cert: ''

  # Path to TLS private key file.
  tls-key: ''

  # Path to TLS CA certificate file for verifying client certificates.
  tls-ca-cert: ''

  # Timeout for collecting metrics
  metrics-timeout: 30s

  # Interval between metrics scrapes
  metrics-interval: 1s

# Prometheus metrics endpoint configuration.
# Exposes check failure counts as Prometheus gauges for external scraping.
prometheus:
  # Enable or disable the Prometheus metrics endpoint
  enabled: true

  # Hostname to bind the Prometheus metrics server to
  hostname: '127.0.0.1'

  # Port to bind the Prometheus metrics server to
  port: 9091

# Backup configuration for creating transactionally safe DuckDB backups.
# Backups are created via NATS micro service endpoints and optionally
# uploaded to a NATS object store for remote access.
backup:
  # TTL for backup files uploaded to the NATS object store.
  # After this duration, uploaded backups are automatically deleted.
  # Env: INSIGHTS_BACKUP_OBJECT_STORE_TTL
  object-store-ttl: 24h

# Version checker configuration.
# When enabled, periodically checks GitHub for a newer release and notifies
# via a log message and a badge in the web UI. Does not download or restart.
# The release repository is baked into the binary at build time, so there is
# no URL or channel to configure.
# For licensed builds, the info dialog shows a direct download link for
# the current OS/architecture. For nolicense builds, users are directed
# to purchases.synadia.com.
updater:
  # Enable or disable version checking
  enabled: true

  # Interval between update checks
  interval: 1h
# Per-check threshold overrides for the audit checks (optional, YAML-only — there
# is no equivalent flag or environment variable).
# Many audit checks accept tunable parameters (a CPU percentage, a lag percentage,
# a byte size, ...) that control when they produce a finding. Defaults suit most
# deployments; override only what you need, keyed by check code and parameter name.
# Run `insights checks list` for codes and `insights checks info <CODE>` for the
# parameters a check accepts. Duration parameters take Go duration strings (e.g.
# 5m, 1h) and must be >= the scrape interval. Unknown parameters are logged and
# ignored; unknown check codes are silently skipped.
# Example (uncomment and adjust):
# check-thresholds:
#   SERVER_003:
#     cpu_percent: 80        # flag servers at or above 80% per-core CPU (default 90)
#   JETSTREAM_001:
#     lag_percent: 20        # flag stream replica lag at or above 20% (default 10)
#   OPT_COST_002:
#     max_memory_mib: 500    # flag memory-backed streams above 500 MiB (default 100)
#   # Optimization checks (codes prefixed OPT_) also accept `lookback`, the analysis
#   # window for range-based checks (default 6h):
#   OPT_PLACE_001:
#     lookback: 4h

# Outbound notification endpoints (optional, YAML-only). Delivers an alert to an
# external endpoint when an audit check changes state. `webhook` endpoints receive
# the full Alertmanager-compatible envelope; `alertmanager` endpoints receive a bare
# alert array for the Alertmanager v2 /api/v2/alerts API. Set web.external-url so
# alert links resolve. Example (uncomment and adjust):
# notifications:
#   webhook:
#     - name: "PagerDuty Relay"
#       url: "https://example.com/webhook"
#       auth-type: "bearer"           # "", basic, bearer, hmac
#       auth-token: "…"
#       subscriptions: [SERVER_001, JETSTREAM_001]
#   alertmanager:
#     - name: "local-am"
#       url: "http://localhost:9093/api/v2/alerts"
#       subscriptions: [SERVER_001]

Environment Variable Naming

Every flag has a corresponding environment variable. The naming convention is:

  • Start with the INSIGHTS_ prefix
  • Replace dots with underscores
  • Convert to uppercase
FlagEnvironment Variable
--log-levelINSIGHTS_LOG_LEVEL
--data-dirINSIGHTS_DATA_DIR
--sys.credsINSIGHTS_SYS_CREDS
--scraper.intervalINSIGHTS_SCRAPER_INTERVAL
--web.portINSIGHTS_WEB_PORT
--db.retention.durationINSIGHTS_DB_RETENTION_DURATION
--sink.retentionINSIGHTS_SINK_RETENTION
--simulator.enabledINSIGHTS_SIMULATOR_ENABLED

Nested sections add their prefix. For example, a scraper NATS connection uses INSIGHTS_SCRAPER_NATS_SERVER.

Configuration Sections

log-level

Controls logging verbosity. Accepted values: debug, info, warn, error.

FlagEnvDefault
--log-levelINSIGHTS_LOG_LEVELinfo

license

License key for production deployments. Provide either a raw JWT string or a path to a file containing the JWT. If both are set, the file takes precedence.

A license is required for production use. It is not required when the simulator is enabled (--simulator.enabled). See Installation › Configure a License for how to obtain and configure a license, and Trial for evaluation.

FlagEnvDefault
--license.tokenINSIGHTS_LICENSE_TOKEN(empty)
--license.fileINSIGHTS_LICENSE_FILE(empty)

data-dir

Base directory for persistent storage. This directory holds the DuckDB database file (insights.db) and JetStream data (nats/).

When unset, a temporary directory is created and all data is lost on restart. Set this for any deployment where you want data to survive restarts.

FlagEnvDefault
--data-dirINSIGHTS_DATA_DIR(temp dir)

sys.*: System Account Connection

NATS connection used to scrape the target NATS system. Insights issues $SYS requests over this connection to collect server metrics. This is required when the simulator is disabled.

FlagEnvDescription
--sys.serverINSIGHTS_SYS_SERVERNATS server URL
--sys.credsINSIGHTS_SYS_CREDSPath to credentials file (.creds)
--sys.contextINSIGHTS_SYS_CONTEXTNATS context name (from nats context)
--sys.userINSIGHTS_SYS_USERUsername for basic auth
--sys.passwordINSIGHTS_SYS_PASSWORDPassword for basic auth
--sys.nkeyINSIGHTS_SYS_NKEYNKey seed for authentication
--sys.jwtINSIGHTS_SYS_JWTUser JWT for authentication
--sys.tls-certINSIGHTS_SYS_TLS_CERTTLS certificate path
--sys.tls-keyINSIGHTS_SYS_TLS_KEYTLS key path
--sys.tls-ca-certINSIGHTS_SYS_TLS_CA_CERTTLS CA certificate path
--sys.tls-firstINSIGHTS_SYS_TLS_FIRSTPerform TLS handshake before NATS protocol
--sys.socks-proxyINSIGHTS_SYS_SOCKS_PROXYSOCKS proxy URL

nats.*: Top-Level NATS Connection

NATS connection used by the API server and as the default for the indexer and scraper if they do not specify their own connections.

This connection is only needed when using an external NATS sink (--sink.embed=false). When the embedded sink is enabled (the default), Insights manages its own internal NATS server automatically.

The top-level connection flags are nats-CLI-style and unprefixed — --server, --creds, --context, --user, --tls-cert, --tls-key, --tls-ca-cert, --tls-first, --socks-proxy — the same options as sys.* above, without the prefix. The pre-rename --nats.* forms remain as hidden aliases, and the YAML uses a nats: block (shown in the example above). Environment variables keep the INSIGHTS_NATS_ prefix (for example --server reads INSIGHTS_NATS_SERVER).

Connection fallback order: scraper.nats falls back to indexer.nats, which falls back to nats (top-level).

db.*: Database

DuckDB configuration options.

FlagEnvDefaultDescription
--db.memory-limitINSIGHTS_DB_MEMORY_LIMIT4GBDuckDB memory limit. Caps the buffer pool to prevent swapping
--db.threadsINSIGHTS_DB_THREADS0DuckDB worker threads (0 = auto, uses all cores)
--db.retention.durationINSIGHTS_DB_RETENTION_DURATION768hHow long to keep data in DuckDB (0 = disabled)
--db.retention.intervalINSIGHTS_DB_RETENTION_INTERVAL10mHow often the retention sweep runs
--db.query-timeoutINSIGHTS_DB_QUERY_TIMEOUT2mMax duration for a single $INS.db.query statement (0 = unlimited)
--db.query-max-rowsINSIGHTS_DB_QUERY_MAX_ROWS100000Max rows the non-streaming $INS.db.query may return; a larger result is rejected with 413 pointing at the streaming endpoint (0 = unlimited)
--db.query-stream.*INSIGHTS_DB_QUERY_STREAM_*Streaming query controls: window (16), chunk-size (512KiB), batch-timeout (30s), ack-idle-timeout (30s), compression (none/lz4/zstd), max-rows (1000000)

The $INS.db.query.stream endpoint streams results as windowed Apache Arrow chunks so neither side buffers the whole result; insights query uses it automatically. --db.query-max-rows caps only the legacy non-streaming endpoint.

scraper.*: Scraper

Controls how Insights collects metrics from NATS servers.

FlagEnvDefaultDescription
--scraper.enabledINSIGHTS_SCRAPER_ENABLEDtrueEnable or disable the scraper
--scraper.intervalINSIGHTS_SCRAPER_INTERVAL1mTime between scrape cycles
--scraper.timeoutINSIGHTS_SCRAPER_TIMEOUT30sTimeout for individual scrape requests
--scraper.filter.allow.servers / .clusters / .tagsINSIGHTS_SCRAPER_FILTER_ALLOW_*(empty)Scrape only servers matching these exact names / clusters / tags
--scraper.filter.deny.servers / .clusters / .tagsINSIGHTS_SCRAPER_FILTER_DENY_*(empty)Never scrape servers matching these exact names / clusters / tags

The scraper optionally accepts its own NATS connection via --scraper.nats.* flags, falling back to the indexer NATS and then the top-level NATS connection.

Server filter. By default every discovered server is scraped. The --scraper.filter.* lists restrict the set by exact match on server name, cluster, or tag. Deny wins over allow, and a non-empty allow list restricts the set. Excluded servers receive no monitoring requests at all.

indexer.*: Indexer

Controls how scraped data is processed and stored in DuckDB.

FlagEnvDefaultDescription
--indexer.enabledINSIGHTS_INDEXER_ENABLEDtrueEnable or disable the indexer
--indexer.stream-latestINSIGHTS_INDEXER_STREAM_LATESTfalseStart consuming from the latest message
--indexer.stream-epochINSIGHTS_INDEXER_STREAM_EPOCH0Start consuming from a specific epoch number
--indexer.stream-filtersINSIGHTS_INDEXER_STREAM_FILTERS(empty)Comma-separated list of endpoints to process (e.g., varz,jsz,connz)
--indexer.stream-intervalINSIGHTS_INDEXER_STREAM_INTERVAL0sDownsample interval. Skip epochs closer together than this

web.*: Web Server

Controls the built-in web UI and HTTP server.

FlagEnvDefaultDescription
--web.enabledINSIGHTS_WEB_ENABLEDtrueEnable or disable the web server
--web.hostnameINSIGHTS_WEB_HOSTNAME127.0.0.1Bind hostname (0.0.0.0 for all interfaces)
--web.portINSIGHTS_WEB_PORT8080Bind port
--web.session-seedINSIGHTS_WEB_SESSION_SEEDinsightsSeed for secure session cookies
--web.tlsINSIGHTS_WEB_TLSfalseEnable TLS (HTTPS). HTTP/2 is automatically available via ALPN
--web.tls-certINSIGHTS_WEB_TLS_CERT(empty)Path to TLS certificate (PEM). Required when --web.tls is set
--web.tls-keyINSIGHTS_WEB_TLS_KEY(empty)Path to TLS private key (PEM). Required when --web.tls is set
--web.tls-ca-certINSIGHTS_WEB_TLS_CA_CERT(empty)Path to a CA certificate (PEM) for verifying client certificates (mTLS)
--web.metrics-timeoutINSIGHTS_WEB_METRICS_TIMEOUT30sTimeout for collecting metrics
--web.metrics-intervalINSIGHTS_WEB_METRICS_INTERVAL1sInterval between metrics scrapes
--web.external-urlINSIGHTS_WEB_EXTERNAL_URL(empty)Public base URL of this instance (e.g. https://insights.example.com); used to build links in notification alert payloads

TLS behavior: TLS is off by default. When enabled (--web.tls), you must supply your own certificate and key (--web.tls-cert / --web.tls-key); enabling TLS without them fails at startup. Insights does not generate a self-signed certificate.

Session seed: The default value "insights" preserves sessions across restarts but should be changed to a unique secret for production deployments.

sink.*: Embedded Sink

Controls the embedded NATS server used for storing scraped data as a JetStream stream.

FlagEnvDefaultDescription
--sink.embedINSIGHTS_SINK_EMBEDtrueUse the embedded NATS server
--sink.hostINSIGHTS_SINK_HOST127.0.0.1Bind host for the embedded server
--sink.portINSIGHTS_SINK_PORT0Bind port (0 = random)
--sink.streamINSIGHTS_SINK_STREAMscrapeJetStream stream name
--sink.batch-sizeINSIGHTS_SINK_BATCH_SIZE500Batch size for sink operations
--sink.retentionINSIGHTS_SINK_RETENTION24hHow long to keep scraped data in the sink stream (0 = unlimited)

Set --sink.embed=false to use an external NATS cluster with JetStream instead of the embedded server. See the deployment guide for external sink topologies.

simulator.*: Simulator

The built-in simulator starts real in-process NATS clusters with traffic workloads, allowing you to explore Insights with zero external dependencies.

FlagEnvDefaultDescription
--simulator.enabledINSIGHTS_SIMULATOR_ENABLEDfalseEnable the embedded simulator
--simulator.profileINSIGHTS_SIMULATOR_PROFILEjs-smallSimulator profile

Available profiles control the size and topology of the simulated deployment:

Profile FamilyVariantsDescription
core-small, medium, largeCore NATS servers
js-small, medium, largeNATS with JetStream
super-small, medium, largeSuper-cluster topology
leaf-small, medium, largeLeaf node topology
super-leaf-small, medium, largeSuper-cluster with leaf nodes

backup.*: Backup

Controls database backup behavior. Backups are created via the NATS micro API and can optionally be uploaded to a NATS object store for remote access.

FlagEnvDefaultDescription
--backup.object-store-ttlINSIGHTS_BACKUP_OBJECT_STORE_TTL24hTTL for backups uploaded to the NATS object store. After this duration, uploaded backups are automatically deleted

check-thresholds: Per-Check Threshold Overrides

Per-check threshold overrides. Many audit checks accept one or more tunable parameters (e.g. a CPU percentage, a lag interval, a byte size) that control when the check produces a finding. Defaults suit most deployments, but production environments often need different thresholds.

Overrides are keyed by check code and parameter name. The parameter names and default values for each check are listed in the Audit Checks Reference — any value shown as a backtick-quoted identifier in the Threshold column (e.g. `cpu_percent`) is tunable here.

Configure overrides in your YAML config file:

check-thresholds:
  SERVER_003:
    cpu_percent: 80 # flag servers >= 80% CPU (default: 90)
  JETSTREAM_001:
    lag_percent: 20 # flag replica lag >= 20% (default: 10)
  OPT_COST_002:
    max_memory_mib: 500 # memory-backed streams > 500 MiB

Duration parameters accept Go duration strings (e.g. 5m, 1h, 24h). They must be greater than or equal to the scrape interval — startup fails with a validation error otherwise.

Optimization checks also accept a special lookback parameter that controls the analysis window for range-based checks:

check-thresholds:
  OPT_PLACE_001:
    lookback: 4h

notifications

Outbound notification endpoints. When an audit check changes state (fires or resolves), Insights delivers the transition to any endpoint subscribed to that check code. Endpoints are declared under two keys by delivery format: webhook (the full Alertmanager-compatible payload envelope) and alertmanager (a bare alert array for the Alertmanager v2 POST /api/v2/alerts API). Both take the same per-endpoint fields:

FieldDefaultDescription
name(required)Human-readable; must be unique across all endpoints
url(required)Destination URL; must be http or https
enabledtrueWhether the endpoint is active
timeout10sHTTP request timeout (1s300s)
max-retries3Delivery attempts before giving up (110)
auth-type(none)Authentication scheme: basic, bearer, or hmac
auth-user(empty)Username for basic auth
auth-token(empty)Password (basic), token (bearer), or secret (hmac)
subscriptions(empty)Check codes this endpoint receives
notifications:
  webhook:
    - name: 'PagerDuty Relay'
      url: 'https://example.com/webhook'
      auth-type: 'bearer'
      auth-token: '…'
      subscriptions: [SERVER_001, JETSTREAM_001]
  alertmanager:
    - name: 'local-am'
      url: 'http://localhost:9093/api/v2/alerts'
      subscriptions: [SERVER_001]

Notifications are a YAML-only setting. Every endpoint is validated at startup: a malformed URL, a duplicate name, an unknown auth-type, or an out-of-range timeout/max-retries fails startup rather than being silently dropped. Set --web.external-url so alert payload links resolve. See the Notifications guide for the full workflow.

Unknown parameter names are logged at startup (unknown check parameter override ignored) and discarded — the check continues to run with its defaults. Unknown check codes are silently ignored, so renamed or removed checks do not prevent the server from starting.

Threshold overrides are a YAML-only setting — there is no equivalent command-line flag or environment variable. Use --config to load a YAML file that contains your overrides.