Configuration

The complete reference for the Dapper YAML configuration file. A config is optional — Dapper runs without one — but it unlocks authenticated testing and lets you constrain or steer the scope of a run. Config files live in ./configs/, which is mounted into the Docker container automatically, and are validated against a JSON Schema (configs/config-schema.json) before a run starts.

  1. Using a config file
  2. Top-level structure
  3. authentication
    1. login_type
    2. credentials
    3. login_flow
    4. success_condition
    5. Full authentication example
  4. rules
    1. Rule object
  5. coverage
  6. targets
  7. accounts
  8. seed_data
  9. exploration
  10. schemas
  11. login (deprecated)
  12. TOTP / 2FA
  13. Ready-made configs

Using a config file

Copy the bundled example and edit it:

cp configs/example-config.yaml configs/my-app-config.yaml

Pass it to start with CONFIG:

./dapper start URL=https://example.com REPO=repo-name \
  CONFIG=./configs/my-app-config.yaml

The file is validated against configs/config-schema.json at startup. A malformed config (unknown field, wrong type, missing required key) fails fast with a schema error rather than starting a partial run.

Top-level structure

A config is a single YAML object. At least one of authentication or rules must be present (anyOf in the schema); all other sections are optional. Unknown top-level keys are rejected.

Field Type Required Description
authentication object conditional Credentials and login flow for authenticated testing. Required unless rules is provided.
rules object conditional Scope rules (avoid / focus). Required unless authentication is provided.
coverage object   Breadth-vs-precision controls for what gets reported.
targets array<string>   Additional entry points (subdomains, services, APIs) to include. Max 100.
accounts array<object>   Extra test accounts with roles for richer authorization coverage. Max 50.
seed_data array<string>   Seed data / setup instructions for richer workflows. Max 200 items, each ≤ 2000 chars.
exploration object   Limits for deeper dynamic testing (depth, request budget, time).
schemas object   API schema locations (OpenAPI / GraphQL) to expand dynamic coverage.
login object   Deprecated. Use authentication instead.
authentication: { ... }
rules:          { ... }
coverage:       { ... }
targets:        [ ... ]
accounts:       [ ... ]
seed_data:      [ ... ]
exploration:    { ... }
schemas:        { ... }

authentication

Configures how the agent logs into the target. All four child fields are required when the authentication section is present. Unknown keys are rejected.

Field Type Required Constraints
login_type string (enum) One of form, sso, api, basic.
login_url string (URI) URL of the login page or endpoint.
credentials object See credentials.
login_flow array<string>   1–20 steps, each 1–500 chars. See login_flow.
success_condition object See success_condition.

login_type

The authentication mechanism the target uses.

Value Meaning
form Standard HTML login form (username/password fields, submit button).
sso Single sign-on / federated identity flow.
api Token- or key-based API authentication.
basic HTTP Basic authentication.

credentials

The login secrets. username and password are required; totp_secret is optional. No other keys are allowed.

Field Type Required Constraints
username string 1–255 chars. Username or email.
password string 1–255 chars.
totp_secret string   Base32, case-insensitive. Must match the pattern ^[A-Za-z2-7]+=*$.
credentials:
  username: "test@example.com"
  password: "yourpassword"
  totp_secret: "JBSWY3DPEHPK3PXP"   # optional, Base32

The totp_secret pattern allows the Base32 alphabet (A–Z, 2–7) with optional trailing = padding. When present, Dapper generates the 6-digit codes automatically through its generate_totp MCP tool during the login flow — no manual entry. See TOTP / 2FA.

login_flow

An ordered list of natural-language steps the agent performs in a real browser to authenticate. Each step is a string (1–500 chars); 1–20 steps allowed. The placeholders $username, $password, and $totp are substituted with the corresponding credential values at runtime.

login_flow:
  - "Type $username into the email field"
  - "Type $password into the password field"
  - "Click the 'Sign In' button"
  - "Enter $totp in the verification code field"
  - "Click 'Verify'"

success_condition

How Dapper confirms a login succeeded. Both fields are required; no other keys are allowed.

Field Type Required Constraints
type string (enum) One of url_contains, element_present, url_equals_exactly, text_contains.
value string 1–500 chars. The value matched against the chosen condition type.
type Succeeds when…
url_contains The post-login URL contains value (e.g. /dashboard).
url_equals_exactly The URL exactly equals value.
element_present An element matching value (e.g. a selector) is present on the page.
text_contains The page text contains value.
success_condition:
  type: url_contains
  value: "/dashboard"

Full authentication example

authentication:
  login_type: form
  login_url: "https://your-app.com/login"
  credentials:
    username: "test@example.com"
    password: "yourpassword"
    totp_secret: "LB2E2RX7XFHSTGCK"
  login_flow:
    - "Type $username into the email field"
    - "Type $password into the password field"
    - "Click the 'Sign In' button"
    - "Enter $totp in the verification code field"
    - "Click 'Verify'"
  success_condition:
    type: url_contains
    value: "/dashboard"

rules

Scope rules shape where Dapper looks. Both sub-arrays are optional but each is capped at 50 entries. Unknown keys are rejected.

Field Type Required Constraints
avoid array<rule>   Areas to exclude from testing. Max 50.
focus array<rule>   Areas to prioritize. Max 50.

Rule object

Every entry in avoid and focus is the same shape. All three fields are required.

Field Type Required Constraints
description string 1–200 chars. Human-readable explanation.
type string (enum) One of path, subdomain, domain, method, header, parameter.
url_path string 1–1000 chars. The pattern/value to match against (per type).
rules:
  avoid:
    - description: "Do not test the marketing site subdomain"
      type: subdomain
      url_path: "www"
    - description: "Skip logout functionality"
      type: path
      url_path: "/logout"
    - description: "No DELETE operations on user API"
      type: path
      url_path: "/api/v1/users/*"
  focus:
    - description: "Prioritize beta admin panel subdomain"
      type: subdomain
      url_path: "beta-admin"
    - description: "Focus on user profile updates"
      type: path
      url_path: "/api/v2/user-profile"

avoid blocks intrusive probes against sensitive paths or features (logout, destructive admin actions). focus biases the agent toward the areas you care about most (an API surface, a new feature).


coverage

Controls breadth versus precision of the findings that get reported. Unknown keys are rejected.

Field Type Required Constraints
mode string (enum)   precision or coverage.
include_potential boolean   Include potential (non-exploit-verified) findings.
include_headers_tls boolean   Include security-header, TLS, and HSTS checks.
include_sast_sca boolean   Include static code / dependency findings when available.
max_findings integer   Optional cap on total findings. 1–10000.
mode Behavior
precision Reports only exploit-verified findings.
coverage Adds potential findings and misconfigurations on top of verified ones.
coverage:
  mode: coverage
  include_potential: true
  include_headers_tls: true
  include_sast_sca: false
  max_findings: 200

targets

Additional entry points to bring into scope — subdomains, services, or APIs beyond the primary URL. Array of strings (each 1–2000 chars), max 100.

targets:
  - "https://api.example.com"
  - "https://admin.example.com"

accounts

Extra test accounts with roles, used to exercise authorization paths (one role accessing another role’s data). Max 50 entries.

Field Type Required Constraints
role string 1–100 chars.
username string 1–255 chars.
password string 1–255 chars.
totp_secret string   Base32, pattern ^[A-Za-z2-7]+=*$.
accounts:
  - role: "admin"
    username: "admin@example.com"
    password: "adminpass"
  - role: "viewer"
    username: "viewer@example.com"
    password: "viewerpass"

seed_data

Free-form setup instructions or seed data to enable richer workflows (e.g. “create a project named X before testing”). Array of strings (each 1–2000 chars), max 200.

seed_data:
  - "Create a sample project named 'demo' before testing"
  - "Upload a test file under Documents"

exploration

Limits for deeper dynamic testing. Unknown keys are rejected.

Field Type Constraints
max_depth integer 1–20. Crawl/exploration depth.
max_requests integer 100–100000. Request budget.
recon_minutes integer 5–1440. Time budget for reconnaissance.
exploit_minutes integer 5–1440. Time budget for exploitation.
exploration:
  max_depth: 5
  max_requests: 5000
  recon_minutes: 30
  exploit_minutes: 60

schemas

API schema locations that expand dynamic coverage. Unknown keys are rejected.

Field Type Constraints
openapi_urls array<string> Each 1–2000 chars, max 50.
graphql_endpoints array<string> Each 1–2000 chars, max 50.
schemas:
  openapi_urls:
    - "https://api.example.com/openapi.json"
  graphql_endpoints:
    - "https://api.example.com/graphql"

login (deprecated)

The login section is deprecated. Use authentication instead. It remains in the schema only for backward compatibility.


TOTP / 2FA

If the target uses two-factor authentication, supply the Base32 TOTP secret in credentials.totp_secret (or per-account in accounts[].totp_secret):

authentication:
  credentials:
    totp_secret: "LB2E2RX7XFHSTGCK"

Dapper generates the required 6-digit codes automatically through its generate_totp MCP tool during the login flow, so no manual intervention is needed. Reference $totp in a login_flow step to place the code.

Ready-made configs

The configs/ folder in the repo holds working examples — OWASP Juice Shop, Chatwoot, Cal.com, Metabase, Keygraph, and others — plus config-schema.json, the authoritative schema this page documents.