{ "$defs": { "AdDefaults": { "properties": { "active": { "default": true, "description": "whether the ad should be published (false = skip this ad)", "title": "Active", "type": "boolean" }, "type": { "default": "OFFER", "description": "type of the ad listing", "enum": [ "OFFER", "WANTED" ], "examples": [ "OFFER", "WANTED" ], "title": "Type", "type": "string" }, "description": { "anyOf": [ { "$ref": "#/$defs/DescriptionAffixes" }, { "type": "null" } ], "default": null, "description": "DEPRECATED: Use description_prefix/description_suffix instead" }, "description_prefix": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": "", "description": "text to prepend to each ad (optional)", "title": "Description Prefix" }, "description_suffix": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": "", "description": "text to append to each ad (optional)", "title": "Description Suffix" }, "price_type": { "default": "NEGOTIABLE", "description": "pricing strategy for the listing", "enum": [ "FIXED", "NEGOTIABLE", "GIVE_AWAY", "NOT_APPLICABLE" ], "examples": [ "FIXED", "NEGOTIABLE", "GIVE_AWAY", "NOT_APPLICABLE" ], "title": "Price Type", "type": "string" }, "auto_price_reduction": { "$ref": "#/$defs/AutoPriceReductionConfig", "description": "automatic price reduction configuration for reposted ads" }, "shipping_type": { "default": "SHIPPING", "description": "shipping method for the item", "enum": [ "PICKUP", "SHIPPING", "NOT_APPLICABLE" ], "examples": [ "PICKUP", "SHIPPING", "NOT_APPLICABLE" ], "title": "Shipping Type", "type": "string" }, "sell_directly": { "default": false, "description": "enable direct purchase option (only works when shipping_type is SHIPPING)", "title": "Sell Directly", "type": "boolean" }, "images": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "description": "default image glob patterns (optional). Leave empty for no default images", "examples": [ "\"images/*.jpg\"", "\"photos/*.{png,jpg}\"" ], "title": "Images" }, "contact": { "$ref": "#/$defs/ContactDefaults", "description": "default contact information for ads" }, "republication_interval": { "default": 7, "description": "number of days between automatic republication of ads", "title": "Republication Interval", "type": "integer" } }, "title": "AdDefaults", "type": "object" }, "AutoPriceReductionConfig": { "properties": { "enabled": { "default": false, "description": "automatically lower the price of reposted ads", "title": "Enabled", "type": "boolean" }, "strategy": { "anyOf": [ { "enum": [ "FIXED", "PERCENTAGE" ], "type": "string" }, { "type": "null" } ], "default": null, "description": "reduction strategy (required when enabled: true). PERCENTAGE = % of price, FIXED = absolute amount", "examples": [ "PERCENTAGE", "FIXED" ], "title": "Strategy" }, "amount": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "default": null, "description": "reduction amount (required when enabled: true). For PERCENTAGE: use percent value (e.g., 10 = 10%%). For FIXED: use currency amount", "examples": [ 10.0, 5.0, 20.0 ], "title": "Amount" }, "min_price": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ], "default": null, "description": "minimum price floor (required when enabled: true). Use 0 for no minimum", "examples": [ 1.0, 5.0, 10.0 ], "title": "Min Price" }, "delay_reposts": { "default": 0, "description": "number of reposts to wait before applying the first automatic price reduction", "minimum": 0, "title": "Delay Reposts", "type": "integer" }, "delay_days": { "default": 0, "description": "number of days to wait after publication before applying automatic price reductions", "minimum": 0, "title": "Delay Days", "type": "integer" } }, "title": "AutoPriceReductionConfig", "type": "object" }, "BrowserConfig": { "properties": { "arguments": { "description": "additional Chromium command line switches (optional). Leave as [] for default behavior. See https://peter.sh/experiments/chromium-command-line-switches/ Common: --headless (no GUI), --disable-dev-shm-usage (Docker fix), --user-data-dir=/path", "examples": [ "\"--headless\"", "\"--disable-dev-shm-usage\"", "\"--user-data-dir=/path/to/profile\"" ], "items": { "type": "string" }, "title": "Arguments", "type": "array" }, "binary_location": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": "", "description": "path to custom browser executable (optional). Leave empty to use system default", "title": "Binary Location" }, "extensions": { "description": "Chrome extensions to load (optional). Leave as [] for no extensions. Add .crx file paths relative to config file", "examples": [ "\"extensions/adblock.crx\"", "\"/absolute/path/to/extension.crx\"" ], "items": { "type": "string" }, "title": "Extensions", "type": "array" }, "use_private_window": { "default": true, "description": "open browser in private/incognito mode (recommended to avoid cookie conflicts)", "title": "Use Private Window", "type": "boolean" }, "user_data_dir": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": "", "description": "custom browser profile directory (optional). Leave empty for auto-configured default", "title": "User Data Dir" }, "profile_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": "", "description": "browser profile name (optional). Leave empty for default profile", "examples": [ "\"Profile 1\"" ], "title": "Profile Name" } }, "title": "BrowserConfig", "type": "object" }, "CaptchaConfig": { "properties": { "auto_restart": { "default": false, "description": "if true, abort when captcha is detected and auto-retry after restart_delay (if false, wait for manual solving)", "title": "Auto Restart", "type": "boolean" }, "restart_delay": { "default": "6h", "description": "duration to wait before retrying after captcha detection (e.g., 1h30m, 6h, 30m)", "examples": [ "6h", "1h30m", "30m" ], "title": "Restart Delay", "type": "string" } }, "title": "CaptchaConfig", "type": "object" }, "CaptureOnConfig": { "description": "Configuration for which operations should trigger diagnostics capture.", "properties": { "login_detection": { "default": false, "description": "Capture screenshot and HTML when login state detection fails", "title": "Login Detection", "type": "boolean" }, "publish": { "default": false, "description": "Capture screenshot, HTML, and JSON on publish failures", "title": "Publish", "type": "boolean" } }, "title": "CaptureOnConfig", "type": "object" }, "ContactDefaults": { "properties": { "name": { "default": "", "description": "contact name displayed on the ad", "title": "Name", "type": "string" }, "street": { "default": "", "description": "street address for the listing", "title": "Street", "type": "string" }, "zipcode": { "anyOf": [ { "type": "integer" }, { "type": "string" } ], "default": "", "description": "postal/ZIP code for the listing location", "title": "Zipcode" }, "location": { "default": "", "description": "city or locality of the listing (can include multiple districts)", "examples": [ "Sample Town - District One" ], "title": "Location", "type": "string" }, "phone": { "default": "", "description": "phone number for contact - only available for commercial accounts, personal accounts no longer support this", "examples": [ "\"01234 567890\"" ], "title": "Phone", "type": "string" } }, "title": "ContactDefaults", "type": "object" }, "DescriptionAffixes": { "deprecated": true, "properties": { "prefix": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "text to prepend to the ad description (deprecated, use description_prefix)", "title": "Prefix" }, "suffix": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "text to append to the ad description (deprecated, use description_suffix)", "title": "Suffix" } }, "title": "DescriptionAffixes", "type": "object" }, "DiagnosticsConfig": { "properties": { "capture_on": { "$ref": "#/$defs/CaptureOnConfig", "description": "Enable diagnostics capture for specific operations." }, "capture_log_copy": { "default": false, "description": "If true, copy the entire bot log file when diagnostics are captured (may duplicate log content).", "title": "Capture Log Copy", "type": "boolean" }, "pause_on_login_detection_failure": { "default": false, "description": "If true, pause (interactive runs only) after capturing login detection diagnostics so that user can inspect the browser. Requires capture_on.login_detection to be enabled.", "title": "Pause On Login Detection Failure", "type": "boolean" }, "output_dir": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Optional output directory for diagnostics artifacts. If omitted, a safe default is used based on installation mode.", "title": "Output Dir" }, "timing_collection": { "default": true, "description": "If true, collect local timeout timing data and write it to diagnostics JSON for troubleshooting and tuning.", "title": "Timing Collection", "type": "boolean" } }, "title": "DiagnosticsConfig", "type": "object" }, "DownloadConfig": { "properties": { "include_all_matching_shipping_options": { "default": false, "description": "if true, all shipping options matching the package size will be included", "title": "Include All Matching Shipping Options", "type": "boolean" }, "excluded_shipping_options": { "description": "shipping options to exclude (optional). Leave as [] to include all. Add items like 'DHL_2' to exclude specific carriers", "examples": [ "\"DHL_2\"", "\"DHL_5\"", "\"Hermes\"" ], "items": { "type": "string" }, "title": "Excluded Shipping Options", "type": "array" }, "folder_name_max_length": { "default": 100, "description": "maximum length for folder names when downloading ads (default: 100)", "maximum": 255, "minimum": 10, "title": "Folder Name Max Length", "type": "integer" }, "rename_existing_folders": { "default": false, "description": "if true, rename existing folders without titles to include titles (default: false)", "title": "Rename Existing Folders", "type": "boolean" } }, "title": "DownloadConfig", "type": "object" }, "LoginConfig": { "properties": { "username": { "description": "kleinanzeigen.de login email or username", "minLength": 1, "title": "Username", "type": "string" }, "password": { "description": "kleinanzeigen.de login password", "minLength": 1, "title": "Password", "type": "string" } }, "required": [ "username", "password" ], "title": "LoginConfig", "type": "object" }, "PublishingConfig": { "properties": { "delete_old_ads": { "anyOf": [ { "enum": [ "BEFORE_PUBLISH", "AFTER_PUBLISH", "NEVER" ], "type": "string" }, { "type": "null" } ], "default": "AFTER_PUBLISH", "description": "when to delete old versions of republished ads", "examples": [ "BEFORE_PUBLISH", "AFTER_PUBLISH", "NEVER" ], "title": "Delete Old Ads" }, "delete_old_ads_by_title": { "default": true, "description": "match old ads by title when deleting (only works with BEFORE_PUBLISH)", "title": "Delete Old Ads By Title", "type": "boolean" } }, "title": "PublishingConfig", "type": "object" }, "TimeoutConfig": { "properties": { "multiplier": { "default": 1.0, "description": "Global multiplier applied to all timeout values.", "minimum": 0.1, "title": "Multiplier", "type": "number" }, "default": { "type": "number", "minimum": 0.0, "default": 5.0, "description": "Baseline timeout for DOM interactions.", "title": "Default" }, "page_load": { "default": 15.0, "description": "Page load timeout for web_open.", "minimum": 1.0, "title": "Page Load", "type": "number" }, "captcha_detection": { "default": 2.0, "description": "Timeout for captcha iframe detection.", "minimum": 0.1, "title": "Captcha Detection", "type": "number" }, "sms_verification": { "default": 4.0, "description": "Timeout for SMS verification prompts.", "minimum": 0.1, "title": "Sms Verification", "type": "number" }, "email_verification": { "default": 4.0, "description": "Timeout for email verification prompts.", "minimum": 0.1, "title": "Email Verification", "type": "number" }, "gdpr_prompt": { "default": 10.0, "description": "Timeout for GDPR/consent dialogs.", "minimum": 1.0, "title": "Gdpr Prompt", "type": "number" }, "login_detection": { "default": 10.0, "description": "Timeout for detecting existing login session via DOM elements.", "minimum": 1.0, "title": "Login Detection", "type": "number" }, "publishing_result": { "default": 300.0, "description": "Timeout for publishing result checks.", "minimum": 10.0, "title": "Publishing Result", "type": "number" }, "publishing_confirmation": { "default": 20.0, "description": "Timeout for publish confirmation redirect.", "minimum": 1.0, "title": "Publishing Confirmation", "type": "number" }, "image_upload": { "default": 30.0, "description": "Timeout for image upload and server-side processing.", "minimum": 5.0, "title": "Image Upload", "type": "number" }, "pagination_initial": { "default": 10.0, "description": "Timeout for initial pagination lookup.", "minimum": 1.0, "title": "Pagination Initial", "type": "number" }, "pagination_follow_up": { "default": 5.0, "description": "Timeout for subsequent pagination navigation.", "minimum": 1.0, "title": "Pagination Follow Up", "type": "number" }, "quick_dom": { "default": 2.0, "description": "Generic short timeout for transient UI.", "minimum": 0.1, "title": "Quick Dom", "type": "number" }, "update_check": { "default": 10.0, "description": "Timeout for GitHub update checks.", "minimum": 1.0, "title": "Update Check", "type": "number" }, "chrome_remote_probe": { "default": 2.0, "description": "Timeout for local remote-debugging probes.", "minimum": 0.1, "title": "Chrome Remote Probe", "type": "number" }, "chrome_remote_debugging": { "default": 5.0, "description": "Timeout for remote debugging API calls.", "minimum": 1.0, "title": "Chrome Remote Debugging", "type": "number" }, "chrome_binary_detection": { "default": 10.0, "description": "Timeout for chrome --version subprocesses.", "minimum": 1.0, "title": "Chrome Binary Detection", "type": "number" }, "retry_enabled": { "default": true, "description": "Enable built-in retry/backoff for DOM operations.", "title": "Retry Enabled", "type": "boolean" }, "retry_max_attempts": { "default": 2, "description": "Max retry attempts when retry is enabled.", "minimum": 1, "title": "Retry Max Attempts", "type": "integer" }, "retry_backoff_factor": { "default": 1.5, "description": "Exponential factor applied per retry attempt.", "minimum": 1.0, "title": "Retry Backoff Factor", "type": "number" } }, "title": "TimeoutConfig", "type": "object" }, "UpdateCheckConfig": { "properties": { "enabled": { "default": true, "description": "whether to check for updates on startup", "title": "Enabled", "type": "boolean" }, "channel": { "default": "latest", "description": "which release channel to check (latest = stable, preview = prereleases)", "enum": [ "latest", "preview" ], "examples": [ "latest", "preview" ], "title": "Channel", "type": "string" }, "interval": { "default": "7d", "description": "how often to check for updates (e.g., 7d, 1d). If invalid, too short (<1d), or too long (>30d), uses defaults: 1d for 'preview' channel, 7d for 'latest' channel", "examples": [ "7d", "1d", "14d" ], "title": "Interval", "type": "string" } }, "title": "UpdateCheckConfig", "type": "object" } }, "properties": { "ad_files": { "default": [ "./**/ad_*.{json,yml,yaml}" ], "description": "\nglob (wildcard) patterns to select ad configuration files\nif relative paths are specified, then they are relative to this configuration file\n", "items": { "type": "string" }, "minItems": 1, "title": "Ad Files", "type": "array" }, "ad_defaults": { "$ref": "#/$defs/AdDefaults", "description": "Default values for ads, can be overwritten in each ad configuration file" }, "categories": { "additionalProperties": { "type": "string" }, "description": "additional name to category ID mappings (optional). Leave as {} if not needed. See full list at: https://github.com/Second-Hand-Friends/kleinanzeigen-bot/blob/main/src/kleinanzeigen_bot/resources/categories.yaml To add: use format 'Category > Subcategory': 'ID'", "examples": [ "\"Elektronik > Notebooks\": \"161/278\"", "\"Jobs > Praktika\": \"102/125\"" ], "title": "Categories", "type": "object" }, "download": { "$ref": "#/$defs/DownloadConfig" }, "publishing": { "$ref": "#/$defs/PublishingConfig" }, "browser": { "$ref": "#/$defs/BrowserConfig", "description": "Browser configuration" }, "login": { "$ref": "#/$defs/LoginConfig", "description": "Login credentials" }, "captcha": { "$ref": "#/$defs/CaptchaConfig" }, "update_check": { "$ref": "#/$defs/UpdateCheckConfig", "description": "Update check configuration" }, "timeouts": { "$ref": "#/$defs/TimeoutConfig", "description": "Centralized timeout configuration." }, "diagnostics": { "$ref": "#/$defs/DiagnosticsConfig", "description": "diagnostics capture configuration for troubleshooting" } }, "title": "Config", "type": "object", "description": "Auto-generated JSON Schema for Config" }