{
  "openapi": "3.0.1",
  "info": {
    "title": "DBA Scraper - Denmark’s Largest Marketplace",
    "description": "Scrape dba.dk — Denmark's largest classifieds platform. Covers both marketplace and vehicle listings in one actor with mode-specific output schemas and incremental change tracking.",
    "version": "0.3",
    "x-build-id": "Krcy9TcC6ViJPn6el"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~dba-listings-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-dba-listings-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/blackfalcondata~dba-listings-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-dba-listings-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/blackfalcondata~dba-listings-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-dba-listings-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "title": "🔍 Search Term",
            "type": "string",
            "description": "Single search keyword (e.g. 'iPhone', 'sofa', 'cykel'). For multiple keywords in one run, use the `queries` array below."
          },
          "queries": {
            "title": "🔎 Multiple Search Terms",
            "type": "array",
            "description": "Run multiple keyword searches in one actor invocation — e.g. `[\"bamse\", \"nike sko\", \"iPhone 15\"]`. Each entry produces a separate search; results are merged and deduplicated by listing ID. Filters below (category, condition, region, price, etc.) apply to ALL queries. Takes precedence over the single `query` field.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "🔗 Search URLs (paste-mode)",
            "type": "array",
            "description": "Paste one or more dba.dk URLs — search-result URLs or category SEO URLs (item detail URLs not yet supported). Build the filters you want in the browser, copy the URL, paste here. Each URL is paginated and merged with the others. Works for both marketplace (`/recommerce/forsale/search?...`) and vehicle (`/mobility/search/car|mc|boat?...`) URLs. Takes precedence over `query`, `queries`, and other filter inputs.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerQuery": {
            "title": "📊 Max Results Per Query",
            "minimum": 0,
            "type": "integer",
            "description": "Cap per individual query when running multiple searches via `queries` or `searchUrls`. 0 = use the global `maxResults` for every query. Useful when batching diverse searches that you want sampled equally (e.g. 50 results from each of 5 categories rather than 250 from one).",
            "default": 0
          },
          "category": {
            "title": "📁 Category",
            "enum": [
              "all",
              "bil_båd_mc_udstyr",
              "dyr",
              "elektronik",
              "erhverv",
              "forældre_børn",
              "have_renovering",
              "kunst_antik",
              "mode_skønhed",
              "møbler_indretning",
              "sport_friluftsliv",
              "underholdning_hobby"
            ],
            "type": "string",
            "description": "Filter by DBA category.",
            "default": "all"
          },
          "mobilityType": {
            "title": "🚗 Mobility Type",
            "enum": [
              "",
              "car",
              "mc",
              "boat"
            ],
            "type": "string",
            "description": "If set, uses the DBA Mobility endpoint for vehicle-specific structured data (cars, motorcycles, boats). Leave empty to use the standard recommerce search.",
            "default": ""
          },
          "yearFrom": {
            "title": "📅 Year From",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum vehicle year (e.g. 2015).",
            "default": 0
          },
          "yearTo": {
            "title": "📅 Year To",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum vehicle year (e.g. 2022).",
            "default": 0
          },
          "mileageFrom": {
            "title": "🛣️ Mileage From (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum mileage in kilometres.",
            "default": 0
          },
          "mileageTo": {
            "title": "🛣️ Mileage To (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum mileage in kilometres.",
            "default": 0
          },
          "fuel": {
            "title": "⛽ Fuel Type",
            "enum": [
              "",
              "Benzin",
              "Diesel",
              "El",
              "Hybrid benzin",
              "Hybrid diesel",
              "Plug-in Benzin",
              "Plug-in Diesel",
              "Gas benzin",
              "Gas (CNG)",
              "Brint"
            ],
            "type": "string",
            "description": "Filter by fuel type. Danish label or numeric ID both work.",
            "default": ""
          },
          "transmission": {
            "title": "⚙️ Transmission",
            "enum": [
              "",
              "Manuelt",
              "Automatisk"
            ],
            "type": "string",
            "description": "Filter by transmission type. Danish label or numeric ID both work.",
            "default": ""
          },
          "registrationClass": {
            "title": "🚘 Registration Class",
            "type": "array",
            "description": "Array of registration class IDs to filter by (e.g. [1] for Personbil, [2] for Varevogn).",
            "default": []
          },
          "dealerSegment": {
            "title": "🏢 Dealer Segment",
            "enum": [
              "",
              "Privat",
              "Forhandler"
            ],
            "type": "string",
            "description": "Filter by seller type.",
            "default": ""
          },
          "condition": {
            "title": "✨ Condition",
            "enum": [
              "all",
              "new_sealed",
              "as_new",
              "good",
              "worn",
              "needs_repair"
            ],
            "type": "string",
            "description": "Filter by item condition.",
            "default": "all"
          },
          "region": {
            "title": "🌍 Region",
            "enum": [
              "all",
              "copenhagen",
              "nordsjælland",
              "vestsjælland",
              "sydsjælland",
              "nordjylland",
              "østjylland",
              "midt_vestjylland",
              "syd_sønderjylland",
              "fyn",
              "bornholm"
            ],
            "type": "string",
            "description": "Filter by geographic region in Denmark.",
            "default": "all"
          },
          "priceMin": {
            "title": "💰 Min Price (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price filter.",
            "default": 0
          },
          "priceMax": {
            "title": "💰 Max Price (DKK)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price filter. 0 = no limit.",
            "default": 0
          },
          "sellerType": {
            "title": "👤 Seller Type",
            "enum": [
              "",
              "private",
              "dealer"
            ],
            "type": "string",
            "description": "Filter by seller type.",
            "default": ""
          },
          "fiksFerdig": {
            "title": "📦 Fiks færdig only",
            "type": "boolean",
            "description": "Marketplace only. When on, return only listings that support DBA's Fiks færdig (transactable shipping via DBA Pay). ~62% of recommerce listings qualify. Maps to `shipping_exists=true` on the SERP URL.",
            "default": false
          },
          "sortBy": {
            "title": "🔀 Sort By",
            "enum": [
              "relevance",
              "newest",
              "oldest",
              "price_asc",
              "price_desc",
              "closest"
            ],
            "type": "string",
            "description": "Sort order for results.",
            "default": "relevance"
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum total results to return. 0 = unlimited.",
            "default": 25
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch full listing details (description, images, category, attributes). Slower but more complete.",
            "default": true
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to N chars. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Core fields only (for AI-agent/MCP workflows).",
            "default": false
          },
          "omitNulls": {
            "title": "🧹 Omit Null / Empty Fields",
            "type": "boolean",
            "description": "Drop fields with null, empty string, empty array, or empty object values from each output row. Reduces dataset size and removes noise for LLM pipelines. Keeps `false` and `0` as valid values. Default on — flip off if you need a stable schema where every row has every documented field.",
            "default": true
          },
          "incremental": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Only return new listings since last run. State is scoped per query+category and saved to a named key-value store between runs.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Custom key for incremental state storage. Defaults to a hash of query+category. Use this to share state across runs with different minor input variations."
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID (e.g. \"-100123456789\"). Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Server Settings → Integrations → Webhooks → New Webhook."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set."
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h (service-conversation window — free since Nov 2024)."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without + (e.g. \"436641234567\"). Recipient must have messaged your business number within last 24h."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n / Make / Zapier / custom backends."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers (e.g. {\"Authorization\":\"Bearer ...\"})."
          },
          "notificationLimit": {
            "title": "📊 Max Listings Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of listings included in each notification message (1–20).",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW and UPDATED listings. Has no effect outside incremental mode.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Pick a single description representation. `all` keeps every variant; `text` / `html` / `markdown` drop the others.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}