{
  "openapi": "3.0.1",
  "info": {
    "title": "Finn.no $0.8💰 URL | Keyword |  Deep Search Scraper",
    "description": "From $0.8/1K. Scrape active Finn.no ads via search builder or URL. Returns 30+ fields per ad, including full HTML description, employer details, deadline, contacts, languages, sector, industries, keywords, and apply URL.",
    "version": "1.4",
    "x-build-id": "ZUv5UXChvKrIPlGM9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~finn-no-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-finn-no-jobs-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/abotapi~finn-no-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-finn-no-jobs-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/abotapi~finn-no-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-finn-no-jobs-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search mode = pick keywords + location + filters below. URL mode = paste any finn.no/job URL refined in a browser (recommended for filters not exposed below).",
            "default": "search"
          },
          "queries": {
            "title": "Keywords (optional)",
            "type": "array",
            "description": "Search mode only, ignored in URL mode. Free-text search terms (e.g. \"developer\", \"sykepleier\", \"prosjektleder\"). One scrape per keyword; leave empty to browse without a keyword filter. Combine with location + employment type for narrower results.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location code (optional)",
            "type": "string",
            "description": "Search mode only, ignored in URL mode. Finn.no hierarchical location code from the URL ?location= param. Format is <level>.<country>.<region>[.<municipality>]. Common values: 0.20001 (Norge, country-wide), 1.20001.20061 (Oslo), 1.20001.20003 (Akershus), 1.20001.20015 (Vestland), 1.20001.20016 (Trøndelag), 1.20001.20012 (Rogaland). The simplest way: open finn.no/job, click a location filter, and copy the code from the URL. Leave empty to search Norway-wide."
          },
          "employmentType": {
            "title": "Employment type",
            "enum": [
              "any",
              "fulltime",
              "parttime",
              "management"
            ],
            "type": "string",
            "description": "Search mode only, ignored in URL mode: a pasted URL carries its own extent/manager_role parameter, and the actor reads the employment type back out of that URL instead. Filter by Finn.no employment scope: fulltime = Heltid (extent=3947), parttime = Deltid (extent=3942), management = Lederstillinger (manager_role=6702). \"any\" walks the unfiltered /job/search page.",
            "default": "fulltime"
          },
          "industry": {
            "title": "Industry filter (optional)",
            "type": "string",
            "description": "Search mode only, ignored in URL mode. Finn.no industry code (e.g. 14 = Barn, skole og undervisning; 11 = IT; 9 = Helse og omsorg; 6 = Bygg og anlegg; 1 = Akademi, forskning. Open a Finn.no SERP, pick an industry, and copy the code from ?industry=."
          },
          "occupation": {
            "title": "Occupation filter (optional)",
            "type": "string",
            "description": "Search mode only, ignored in URL mode. Finn.no occupation/job-function code from ?occupation=. More specific than industry. Look in a Finn.no SERP URL after picking a job function."
          },
          "sector": {
            "title": "Sector filter (optional)",
            "enum": [
              "any",
              "private",
              "public"
            ],
            "type": "string",
            "description": "Search mode only, ignored in URL mode. Limit by employer sector.",
            "default": "any"
          },
          "workLanguage": {
            "title": "Working language (optional)",
            "enum": [
              "any",
              "norwegian",
              "english",
              "swedish",
              "danish",
              "other"
            ],
            "type": "string",
            "description": "Search mode only, ignored in URL mode. Workplace working language. Maps to Finn.no ?workLanguage= filter.",
            "default": "any"
          },
          "publishedSince": {
            "title": "Posted since (optional)",
            "enum": [
              "any",
              "1",
              "3",
              "7",
              "14",
              "30"
            ],
            "type": "string",
            "description": "Search mode only, ignored in URL mode. Limit to ads posted within the last N days.",
            "default": "any"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "default",
              "published_desc",
              "deadline_asc"
            ],
            "type": "string",
            "description": "Search mode only, ignored in URL mode: a pasted URL keeps whatever ?sort= it already carries. How Finn.no orders the SERP. \"Default\" is Finn's relevance ranking.",
            "default": "default"
          },
          "urls": {
            "title": "Search URLs (URL mode)",
            "type": "array",
            "description": "URL mode only, ignored in Search mode. One or more finn.no/job URLs. Examples: https://www.finn.no/job/search?q=developer or https://www.finn.no/job/ad/461652761 (single ad). Legacy /job/<type>/search.html URLs are auto-canonicalized to the working /job/search?extent=<N> form so pagination works. Multi-URL supported; each URL pages forward independently. The Search mode fields above (keywords, location, employment type, industry, occupation, sector, working language, posted since, sort) are ignored here, because the pasted URL already carries its own filters. Skip sponsored placements, in the Filters section below, still applies to what a pasted URL returns.",
            "items": {
              "type": "string"
            }
          },
          "skipSponsored": {
            "title": "Skip sponsored placements (post-filter)",
            "type": "boolean",
            "description": "Applies in BOTH search mode and URL mode. Drop \"Betalt plassering\" cards (paid promotions). Applied after fetch as a client-side filter, so it also removes sponsored cards from the results of a pasted finn.no/job search URL.",
            "default": false
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "How many SERP pages to walk per query × employment-type combination (or per pasted URL). Each page returns up to ~50 listings. Leave empty (or 0) to walk every result page until Finn.no has no more."
          },
          "maxListings": {
            "title": "Max listings (total)",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many listings across all searches. 0 = unlimited (still bounded by maxPages).",
            "default": 20
          },
          "fetchDetails": {
            "title": "Fetch detail pages (richer data)",
            "type": "boolean",
            "description": "When ON, fetch full ad details: full HTML description, deadline, employer details, sector, industries, working languages, contact persons, keywords, and apply URL. SERP cards already carry id, title, employer, location, and posted date, so simple feeds work fine with this OFF. Default ON for richer output.",
            "default": true
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (optional)",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those listings returned (and billed). State is kept separately for each search/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and detail settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max listings capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Works on every plan, including Free. Apify Proxy is recommended for reliability; for higher volume or stable Norwegian routing, add groups: [\"RESIDENTIAL\"], country: \"NO\"."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}