{
  "openapi": "3.0.1",
  "info": {
    "title": "Finn.no Mobility Scraper 💰 $2/1K — Cars, MC, Boats & More",
    "description": "Scrape finn.no/mobility — Norway's largest vehicle marketplace with 100,000+ listings across 6 categories. Full spec sheets, dealer details, and incremental change tracking for precise targeting.",
    "version": "0.3",
    "x-build-id": "dq6GgnFaRFM3AlMO9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~finn-mobility-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-finn-mobility-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~finn-mobility-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-finn-mobility-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~finn-mobility-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-finn-mobility-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": {
          "category": {
            "title": "📁 Category",
            "enum": [
              "car",
              "mc",
              "boat",
              "b2b",
              "caravan",
              "mobilehome"
            ],
            "type": "string",
            "description": "Vehicle category to scrape.",
            "default": "car"
          },
          "query": {
            "title": "🔍 Search Term(s)",
            "type": "string",
            "description": "Free-text search keywords (e.g. \"Toyota HiLux\"). Leave empty to browse all listings."
          },
          "startUrls": {
            "title": "🔗 Start URLs (paste-mode)",
            "type": "array",
            "description": "Paste one or more finn.no mobility search URLs. Build the search you want on finn.no, copy the URL from your browser address bar, and paste it here. Each URL is fetched with all of its filters and paginated automatically; results from multiple URLs are merged and deduplicated. Takes precedence over the search term and the filter fields. Paste a search-results URL, not an individual listing URL. The legacy field name `searchUrls` is also accepted.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "make": {
            "title": "Make / Brand",
            "enum": [
              "",
              "Volkswagen",
              "Toyota",
              "BMW",
              "Mercedes-Benz",
              "Volvo",
              "Ford",
              "Audi",
              "Peugeot",
              "Skoda",
              "Nissan",
              "Tesla",
              "Mitsubishi",
              "Kia",
              "Hyundai",
              "Opel",
              "Citroen",
              "Mazda",
              "Porsche",
              "Suzuki",
              "Renault",
              "Land Rover",
              "MG",
              "BYD",
              "Subaru",
              "Polestar",
              "Chevrolet",
              "Lexus",
              "MINI",
              "Honda",
              "Jaguar",
              "Fiat",
              "Jeep",
              "Saab",
              "Cupra",
              "Alfa Romeo",
              "DS",
              "Cadillac",
              "Ferrari",
              "Bentley",
              "Maserati",
              "Abarth",
              "Dodge",
              "XPeng"
            ],
            "type": "string",
            "description": "Filter by vehicle make. Brand name (e.g. \"Toyota\", \"BMW\") or raw Schibsted variant ID (e.g. \"0.749\" for BMW). Unknown brands are silently dropped.",
            "default": ""
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "City or region (e.g. \"Oslo\", \"Bergen\")."
          },
          "yearFrom": {
            "title": "📅 Year From",
            "minimum": 1900,
            "maximum": 2100,
            "type": "integer",
            "description": "Earliest model year to include. Listings with a model year older than this are excluded. Combine with `yearTo` to bound the range. Leave blank to include all years."
          },
          "yearTo": {
            "title": "📅 Year To",
            "minimum": 1900,
            "maximum": 2100,
            "type": "integer",
            "description": "Latest model year to include. Listings with a model year newer than this are excluded. Combine with `yearFrom` to bound the range. Leave blank to include all years."
          },
          "priceFrom": {
            "title": "Price From (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum asking price in NOK."
          },
          "priceTo": {
            "title": "Price To (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum asking price in NOK."
          },
          "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": [
              "",
              "Bensin",
              "Diesel",
              "El",
              "Hybrid bensin",
              "Hybrid diesel",
              "Plug-in Bensin",
              "Plug-in Diesel",
              "Gass (CNG)",
              "Gass+bensin",
              "Hydrogen",
              "Etanol (FFV, E85)"
            ],
            "type": "string",
            "description": "Filter by fuel type. Norwegian label or numeric ID both work.",
            "default": ""
          },
          "transmission": {
            "title": "⚙️ Transmission",
            "enum": [
              "",
              "Manuell",
              "Automat"
            ],
            "type": "string",
            "description": "Filter by transmission type. Norwegian label or numeric ID both work.",
            "default": ""
          },
          "dealerSegment": {
            "title": "🏢 Seller Segment",
            "enum": [
              "",
              "Merkeforhandler",
              "Annet bilutsalg",
              "Privat"
            ],
            "type": "string",
            "description": "Filter by seller type.",
            "default": ""
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of listings to return (0 = unlimited). Memory scales with this: ≤1000 results uses 256 MB, >1000 uses 512 MB.",
            "default": 50
          },
          "fetchDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch individual listing pages for full specs (vehicleSpecs), sellerKnowledge Q&A, dealer infokort (orgNr, streetAddress, dealer page), inspection report URL, and updatedAt. Adds one HTTP request per listing.",
            "default": true
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description text to N characters. 0 = no truncation. Only relevant when fetchDetails is true.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Return core fields only (listingId, make, model, year, price, mileage, fuel, transmission, location, url). Ideal for AI-agent and 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
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Only emit new or changed listings compared to the previous run. Requires stateKey.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional stable identifier for the tracked search universe. Leave empty to auto-derive a stable identifier from your search inputs — different keyword/location/filter combinations get isolated state automatically."
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "In incremental mode, skip listings that appear to be reposts of previously-seen expired listings (same content hash).",
            "default": false
          },
          "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 where alerts are sent (e.g. \"-100123456789\" for a private group, or \"@yourchannel\")."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Get one from Server Settings → Integrations → Webhooks."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. Create at api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📱 WhatsApp Phone Number ID",
            "type": "string",
            "description": "WhatsApp Business phone number ID from Meta Business Manager (NOT the phone number itself — the numeric ID shown next to your business number). Free service-conversation messages within 24 hours of last user-initiated contact."
          },
          "whatsappAccessToken": {
            "title": "🔐 WhatsApp Access Token",
            "type": "string",
            "description": "Meta Cloud API access token with `whatsapp_business_messaging` scope. Get a permanent token from a system user in Meta Business Manager."
          },
          "whatsappTo": {
            "title": "📨 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format (e.g. +4791234567). Recipient must have messaged your business number within the last 24 hours — outside that window, free-form text is rejected by Meta."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Generic webhook URL that receives a JSON POST with the full listing payload + run metadata. Universal escape hatch for n8n / Make / Zapier / your own backend."
          },
          "webhookHeaders": {
            "title": "🔑 Webhook Headers",
            "type": "object",
            "description": "Optional headers (e.g. {\"Authorization\": \"Bearer xyz\"}) sent with the webhook POST."
          },
          "notificationLimit": {
            "title": "📊 Max Listings Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of listings included in each notification message (1–20). Excess listings are still in the dataset; notifications get a summary line.",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW / UPDATED / REAPPEARED 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
          },
          "appConnector": {
            "title": "Send results to Notion (or another connected app)",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results. Notion is supported today (a run-summary page); other MCP connectors are best-effort as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}