sendit is configured via a YAML file. Every section has defaults — only override what you need.

See config/example.yaml for a fully annotated example.

pacing

Controls how requests are spaced in time. See Pacing Modes for details.

FieldTypeDefaultDescription
modestringhumanhuman | rate_limited | scheduled | burst
requests_per_minutefloat20Target RPM — used by rate_limited and scheduled only
jitter_factorfloat0.4Reserved for future modes; unused in current pacing logic
min_delay_msint800Minimum inter-request delay for human mode (ms)
max_delay_msint8000Maximum inter-request delay for human mode (ms)
schedulelist[]Cron windows — required when mode: scheduled
ramp_up_sint0Seconds to linearly ramp up to full speed — burst mode only; 0 = immediate full speed

limits

Concurrency and local resource thresholds.

FieldTypeDefaultDescription
max_workersint4Max simultaneous requests across all drivers
max_browser_workersint1Sub-limit for concurrent headless browser instances
cpu_threshold_pctfloat60.0Pause dispatch when CPU exceeds this percentage
memory_threshold_mbint512Pause dispatch when RAM in use exceeds this value (MB)

Note: memory_threshold_mb defaults to 512 MB. Set it above your system’s idle memory footprint (e.g. 8192 on a 16 GB machine) to avoid inadvertently blocking dispatch.

rate_limits

Per-domain token buckets applied after the pacing delay and before acquiring a worker slot.

FieldTypeDefaultDescription
default_rpsfloat0.5RPS applied to all domains not in per_domain
per_domainlist[]List of {domain, rps} overrides
rate_limits:
  default_rps: 0.5
  per_domain:
    - domain: "example.com"
      rps: 0.2
    - domain: "api.example.com"
      rps: 1.0

backoff

Retry behaviour on transient errors (HTTP 429/502/503/504, DNS SERVFAIL, network failures).

FieldTypeDefaultDescription
initial_msint1000Base delay for the first retry (ms)
max_msint120000Maximum delay cap (ms)
multiplierfloat2.0Exponential growth factor per attempt
max_attemptsint3Stop retrying after this many consecutive failures per domain

Permanent errors (HTTP 400/403/404, DNS NXDOMAIN/REFUSED) are logged and skipped immediately with no retry.

targets

Inline list of endpoints. Each target has a weight for weighted random selection (Vose alias method, O(1) per pick).

targets:
  - url: "https://example.com"
    weight: 10
    type: http
    http:
      method: GET
      timeout_s: 15

See Drivers for per-driver field reference.

targets_file and target_defaults

Load targets from a plain-text file instead of (or in addition to) the inline targets list.

File format — one entry per line: <url> <type> [weight]

# config/targets.txt
https://example.com             http      5
https://api.example.com         http      3
example.com                     dns       2
wss://ws.example.com            websocket
grpc://svc.example.com:50051/helloworld.Greeter/SayHello   grpc   4

target_defaults supplies remaining fields for every file-loaded target:

targets_file: "config/targets.txt"

target_defaults:
  weight: 1
  http:
    method: GET
    timeout_s: 15
  dns:
    resolver: "8.8.8.8:53"
    record_type: A
target_defaults fieldDefaultDescription
weight1Selection weight when omitted from the file
auth.type""Auth type: bearer | basic | header | query — see Drivers
http.methodGETHTTP verb
http.timeout_s15Request timeout (seconds)
browser.timeout_s30Page load timeout (seconds)
dns.resolver8.8.8.8:53DNS resolver address
dns.record_typeADNS record type
websocket.duration_s30How long to hold the connection open (seconds)
grpc.timeout_s15Per-call timeout (seconds)

output

Optional result export to a file for offline analysis.

FieldTypeDefaultDescription
enabledboolfalseEnable result export
filestringsendit-results.jsonlOutput file path
formatstringjsonljsonl (one JSON object per line) | csv
appendboolfalseAppend to an existing file instead of truncating on start

Each JSONL record contains: ts, url, type, status, duration_ms, bytes, error.

metrics

Optional Prometheus exposition endpoint.

metrics:
  enabled: true
  prometheus_port: 9090

When enabled, two endpoints are served on prometheus_port:

EndpointDescription
GET /metricsPrometheus scrape endpoint
GET /healthzLiveness probe — always returns 200 {"status":"ok"}

See Metrics for the full metric reference and label descriptions.

daemon

Process management settings.

FieldTypeDefaultDescription
pid_filestring/tmp/sendit.pidWritten by start unless --foreground is set
log_levelstringinfodebug | info | warn | error
log_formatstringtexttext (coloured console) | json