{
  "openapi": "3.0.1",
  "info": {
    "title": "mobile.de Car Scraper - Germany’s Largest Car Marketplace",
    "description": "Scrape mobile.de - Germany’s largest car marketplace. Prices, full specifications, seller details, image galleries, and search filters. Incremental mode detects new and changed listings. Compact output for AI agents and MCP workflows.",
    "version": "0.2",
    "x-build-id": "bVkquYoIscZMmIgXp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~mobile-de-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-mobile-de-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~mobile-de-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-mobile-de-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~mobile-de-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-mobile-de-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(s)",
            "type": "string",
            "description": "Free-text search keywords (e.g. 'VW Golf GTI'). Use a JSON array for multi-query."
          },
          "make": {
            "title": "Make",
            "type": "string",
            "description": "Car make / brand (e.g. 'Volkswagen', 'BMW', 'Mercedes-Benz')."
          },
          "model": {
            "title": "Model(s)",
            "type": "string",
            "description": "Single model name (e.g. 'Golf'), comma-separated list, or JSON array. Requires make."
          },
          "category": {
            "title": "🚗 Vehicle Category",
            "enum": [
              "CAR",
              "MOTORBIKE",
              "MOTORHOME",
              "VAN",
              "TRUCK_UP_TO_7500",
              "TRUCK_OVER_7500",
              "BUS",
              "TRAILER",
              "SEMI_TRAILER",
              "SEMI_TRAILER_TRUCK",
              "CONSTRUCTION_MACHINE",
              "AGRICULTURAL_VEHICLE",
              "FORKLIFT_TRUCK"
            ],
            "type": "string",
            "description": "Vehicle type. mobile.de carries cars, motorbikes, motorhomes, trucks, vans, buses, trailers, agricultural and construction machinery.",
            "default": "CAR"
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste mobile.de search URLs directly. Use this for full filter control beyond the structured fields below.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum total listings to return (0 = unlimited). mobile.de SERPs cap at ~2,000 per query.",
            "default": 25
          },
          "maxPages": {
            "title": "📄 Max Pages",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum search result pages to scrape per source (~26 listings per page).",
            "default": 5
          },
          "maxConcurrency": {
            "title": "⚙️ Max Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel page + detail fetches. Higher = faster but spends Scrape.do credits in parallel.",
            "default": 5
          },
          "condition": {
            "title": "Condition",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by vehicle condition. Multi-select: hold Ctrl / Cmd to select several.",
            "items": {
              "type": "string",
              "enum": [
                "NEW",
                "USED",
                "EMPLOYEE_CAR",
                "PRE_REGISTRATION",
                "DEMONSTRATION",
                "CLASSIC"
              ],
              "enumTitles": [
                "New",
                "Used",
                "Employee Car",
                "Pre-Registration (Tageszulassung)",
                "Demonstration (Vorführfahrzeug)",
                "Classic / Oldtimer"
              ]
            }
          },
          "fuelType": {
            "title": "Fuel Type",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by fuel type. Multi-select.",
            "items": {
              "type": "string",
              "enum": [
                "DIESEL",
                "PETROL",
                "ELECTRIC",
                "HYBRID",
                "PLUG_IN_HYBRID",
                "HYBRID_DIESEL",
                "CNG",
                "LPG",
                "HYDROGEN",
                "ETHANOL"
              ],
              "enumTitles": [
                "Diesel",
                "Petrol",
                "Electric",
                "Hybrid",
                "Plug-in Hybrid",
                "Hybrid (Diesel)",
                "CNG",
                "LPG",
                "Hydrogen",
                "Ethanol"
              ]
            }
          },
          "transmission": {
            "title": "Transmission",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by transmission. Multi-select.",
            "items": {
              "type": "string",
              "enum": [
                "MANUAL_GEAR",
                "AUTOMATIC_GEAR",
                "SEMI_AUTOMATIC_GEAR"
              ],
              "enumTitles": [
                "Manual",
                "Automatic",
                "Semi-Automatic"
              ]
            }
          },
          "bodyType": {
            "title": "Body Type",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by body type. Multi-select.",
            "items": {
              "type": "string",
              "enum": [
                "LIMOUSINE",
                "KOMBI",
                "KLEINWAGEN",
                "COUPE",
                "CABRIO",
                "SUV",
                "GELAENDEWAGEN",
                "VAN",
                "PICKUP"
              ],
              "enumTitles": [
                "Sedan (Limousine)",
                "Estate / Wagon (Kombi)",
                "Small Car (Kleinwagen)",
                "Coupe / Sports Car",
                "Convertible (Cabrio)",
                "SUV",
                "Off-Road (Geländewagen)",
                "Van / Minibus",
                "Pickup / Other"
              ]
            }
          },
          "sellerType": {
            "title": "Seller Type",
            "enum": [
              "DEALER",
              "PRIVATE"
            ],
            "type": "string",
            "description": "Filter by seller type."
          },
          "damageStatus": {
            "title": "🚧 Damage Status",
            "enum": [
              "ANY",
              "EXCLUDE",
              "ONLY"
            ],
            "type": "string",
            "description": "Whether to include damaged vehicles.",
            "default": "ANY"
          },
          "exteriorColor": {
            "title": "🎨 Exterior Color",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter by exterior color. Multi-select.",
            "items": {
              "type": "string",
              "enum": [
                "BLACK",
                "WHITE",
                "SILVER",
                "GREY",
                "BLUE",
                "RED",
                "GREEN",
                "YELLOW",
                "BROWN",
                "BEIGE",
                "GOLD",
                "ORANGE",
                "VIOLET",
                "OTHER"
              ],
              "enumTitles": [
                "Black",
                "White",
                "Silver",
                "Grey",
                "Blue",
                "Red",
                "Green",
                "Yellow",
                "Brown",
                "Beige",
                "Gold",
                "Orange",
                "Violet",
                "Other"
              ]
            }
          },
          "priceMin": {
            "title": "💰 Price Min (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price in EUR."
          },
          "priceMax": {
            "title": "💰 Price Max (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price in EUR."
          },
          "mileageMin": {
            "title": "Mileage Min (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum mileage in km."
          },
          "mileageMax": {
            "title": "Mileage Max (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum mileage in km."
          },
          "yearMin": {
            "title": "Year Min",
            "minimum": 1900,
            "maximum": 2030,
            "type": "integer",
            "description": "Minimum first registration year."
          },
          "yearMax": {
            "title": "Year Max",
            "minimum": 1900,
            "maximum": 2030,
            "type": "integer",
            "description": "Maximum first registration year."
          },
          "powerMin": {
            "title": "Power Min (PS)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum engine power in PS (auto-converted to kW for mobile.de)."
          },
          "powerMax": {
            "title": "Power Max (PS)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum engine power in PS."
          },
          "zipCode": {
            "title": "📍 ZIP Code",
            "type": "string",
            "description": "German postal code for location-based search."
          },
          "radiusKm": {
            "title": "📡 Radius (km)",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Search radius around ZIP code in km."
          },
          "radiusMiles": {
            "title": "📡 Radius (miles, alt)",
            "minimum": 0,
            "maximum": 310,
            "type": "integer",
            "description": "Alternative to Radius (km). Auto-converted to km. If both set, km wins."
          },
          "sort": {
            "title": "🔀 Sort Order",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "mileage_asc",
              "mileage_desc",
              "registration_desc",
              "registration_asc",
              "newest",
              "oldest"
            ],
            "type": "string",
            "description": "How to sort listings.",
            "default": "relevance"
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch each listing's detail page to extract VIN, full description, equipment list, EV battery capacity, accident history, dealer street + coordinates + phone, and 25+ additional fields. Slower but unlocks the richest output.",
            "default": true
          },
          "reviewLimit": {
            "title": "⭐ Dealer Review Limit",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum dealer review bodies to extract per listing (0 = no review text, only count + average). Requires Include Full Details.",
            "default": 0
          },
          "fromDate": {
            "title": "📅 From Date",
            "type": "string",
            "description": "Only include listings created on or after this date. Accepts YYYY-MM-DD or ISO-8601."
          },
          "toDate": {
            "title": "📅 To Date",
            "type": "string",
            "description": "Only include listings created on or before this date."
          },
          "maxAgeMinutes": {
            "title": "⏰ Max Listing Age (minutes)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include listings created within the last N minutes. 0 = no limit. Pairs well with scheduled runs for real-time monitoring.",
            "default": 0
          },
          "includeKeywords": {
            "title": "🔍 Include Keywords",
            "type": "object",
            "description": "Require at least one of these keywords. Either a JSON array of strings (matches title/subtitle/description) or {\"keywords\":[\"...\"],\"matchTitle\":true,\"matchDescription\":true,\"matchSubTitle\":true}."
          },
          "excludeKeywords": {
            "title": "🚫 Exclude Keywords",
            "type": "object",
            "description": "Drop listings containing any of these keywords. Same shape as Include Keywords."
          },
          "customFilters": {
            "title": "🔧 Custom Filters",
            "type": "array",
            "description": "Array of rules applied to any output field. Each rule: {\"field\":\"<name>\",\"op\":\"includes|notIncludes|equals|notEquals|gt|gte|lt|lte\",\"value\":...}. Example: [{\"field\":\"powerPs\",\"op\":\"gte\",\"value\":300},{\"field\":\"description\",\"op\":\"notIncludes\",\"value\":\"Bastler\"}]."
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate the listing description to N characters. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Output only core fields (for AI-agent / MCP workflows).",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Only output new or changed listings since the last run. Unchanged listings are skipped (set Emit Unchanged to keep them). State is persisted across runs in the named KV store 'mobile-de-state'.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Identifier for the incremental state. Use a unique key per search query to track changes independently (e.g. 'vw-golf-berlin'). Defaults to a key derived from the search inputs."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged Records",
            "type": "boolean",
            "description": "When incremental, also emit records that have not changed since last run.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired Records",
            "type": "boolean",
            "description": "When incremental, also emit records that disappeared since last run (sold or removed).",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "Suppress listings that appear to be reposts of previously seen (and now expired) listings based on content fingerprint matching.",
            "default": false
          },
          "telegramToken": {
            "title": "📱 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token from @BotFather. Sends notifications when new or changed listings are emitted. Pairs well with incrementalMode for real-time alerts."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat / Channel ID",
            "type": "string",
            "description": "Chat ID (from @userinfobot) or channel ID (starts with -100 for channels). Required when telegramToken is set."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Incoming Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. Sends listings as formatted messages with price, mileage, fuel, registration year, and link."
          },
          "discordWebhookUrl": {
            "title": "💬 Discord Webhook URL",
            "type": "string",
            "description": "Discord channel webhook URL. Sends rich embeds colour-coded by change type (green=NEW, amber=UPDATED, red=PRICE_DOWN)."
          },
          "whatsappAccessToken": {
            "title": "🟢 WhatsApp Cloud API Token",
            "type": "string",
            "description": "Permanent System User access token from Meta Business Suite (graph.facebook.com). Required together with WhatsApp Phone Number ID + recipient. The recipient must have messaged your business number within the last 24 h — outside that window, only pre-approved templates work and free-form alerts are rejected."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Numeric Phone Number ID from your WhatsApp Business Account (Meta Dashboard)."
          },
          "whatsappTo": {
            "title": "📱 WhatsApp Recipient (E.164)",
            "type": "string",
            "description": "Recipient phone number in E.164 format without leading +, e.g. \"491701234567\"."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Universal escape hatch for n8n / Make / Zapier / custom HTTP backends. Receives a JSON POST `{ metadata, items }` per run. Single attempt, 15 s timeout."
          },
          "webhookHeaders": {
            "title": "🪝 Webhook Headers (optional)",
            "type": "object",
            "description": "Additional HTTP headers sent with the generic webhook POST (e.g. `{\"Authorization\":\"Bearer ...\"}`). Content-Type is always `application/json`."
          },
          "notificationLimit": {
            "title": "🔢 Notifications per Run",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of listings to notify per run. Prevents spam on large result sets.",
            "default": 5
          },
          "includeRunMetadata": {
            "title": "📣 Include Run Summary in Notifications",
            "type": "boolean",
            "description": "Prepend a one-line summary (search label + total count) to each notification batch.",
            "default": true
          },
          "notifyOnlyChanges": {
            "title": "🆕 Notify Only on Changes",
            "type": "boolean",
            "description": "When ON (default) AND incrementalMode is ON, send notifications only for NEW / UPDATED / PRICE-changed listings. Without incrementalMode, this has no effect.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy Configuration",
            "type": "object",
            "description": "Optional proxy configuration. Internally the actor routes mobile.de traffic through Scrape.do super-mode (Akamai bypass) — this proxy override is for advanced use cases only."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}